对于带有std :: map member 的类,无效使用了不完整的类型。

问题描述 投票:0回答:1
我正在尝试使用SFINAE编写模板类,以从地图转换为json,反之亦然。想法是将类限制为具有整数值类型或可转换为int(即枚举)的映射,但是我在编译类时遇到问题。

到目前为止是我的代码:

MapToJsonConvertor.h:

#ifndef COMMON_MAPTOJSONCONVERTOR_H_ #define COMMON_MAPTOJSONCONVERTOR_H_ #include <Poco/JSON/Object.h> #include <Poco/JSON/Parser.h> #include <Poco/Dynamic/Var.h> #include <Poco/JSON/Stringifier.h> #include <map> #include <type_traits> template<typename T, typename = typename std::enable_if<std::is_convertible<T, int>::value, T>::type> class MapToJsonConvertor { public: MapToJsonConvertor(const std::map<int, T> &mapFrom): mMap(mapFrom) {} MapToJsonConvertor(const Poco::JSON::Object::Ptr &jsonObject): mJsonObject(jsonObject) {} Poco::JSON::Object::Ptr Convert(const std::string &rootName); //std::map<int, T> Convert(const Poco::JSON::Object::Ptr &jsonObject); private: std::map<int, T> mMap; Poco::JSON::Object::Ptr mJsonObject; }; #endif /* COMMON_MAPTOJSONCONVERTER_H_ */

MapToJsonConvertor.cpp

#include "MapToJsonConvertor.h" template<typename T> Poco::JSON::Object::Ptr MapToJsonConvertor<T>::Convert(const std::string &rootName) { Poco::JSON::Object::Ptr root = new Poco::JSON::Object(); Poco::JSON::Array::Ptr array = new Poco::JSON::Array(); if (!mMap.empty()) { for (auto &elem : mMap) { Poco::JSON::Object::Ptr elemPtr = new Poco::JSON::Object(); elemPtr->set("key", elem.first); elemPtr->set("value", static_cast<int>(elem.second)); array->add(elemPtr); } } root->set("elements", array); return root; }

我得到的错误是:

../ src / Common / MapToJsonConvertor.cpp:12:83:错误:无效使用类型不完整的“类MapToJsonConvertor ” Poco :: JSON :: Object :: PtrMapToJsonConvertor :: Convert(const std :: string&rootName)^在../src/Common/MapToJsonConvertor.cpp:9:0中包含的文件中:../src/Common/MapToJsonConvertor.h:21:7:注意:“ class”的声明MapToJsonConvertor ’类MapToJsonConvertor^

我正在使用Poco库构建Json。

我对使用SFINAE进行模板元编程还是不熟悉,因此,我希望获得一些帮助。我在做什么错?

我正在尝试使用SFINAE编写模板类,以从地图转换为json,反之亦然。想法是将类限制为具有整数值类型或可转换为int的映射,即...

c++ sfinae
1个回答
1
投票
因此,首先,应该在头文件中实现模板,如here所述。
© www.soinside.com 2019 - 2024. All rights reserved.