对 class 和 std::map<int, T> 成员使用不完整类型无效
Invalid use of incomplete type for class with std::map<int, T> member
我正在尝试使用 SFINAE 编写模板 class 以将地图转换为 json,反之亦然。这个想法是将 class 限制为具有整数值类型或可转换为 int 的映射,即枚举,但我在编译 class.
时遇到问题
到目前为止,这是我的代码:
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: error: invalid use of
incomplete type ‘class MapToJsonConvertor<T>’ Poco::JSON::Object::Ptr
MapToJsonConvertor<T>::Convert(const std::string &rootName)
^
In file included from ../src/Common/MapToJsonConvertor.cpp:9:0:
../src/Common/MapToJsonConvertor.h:21:7: note: declaration of ‘class
MapToJsonConvertor<T>’ class MapToJsonConvertor
^
我正在使用 Poco 库进行 Json 构建。
我对使用 SFINAE 进行模板元编程还很陌生,所以我希望得到一些帮助。我做错了什么?
所以首先,模板应该按照说明在头文件中实现here。
除此之外,您的问题还在于源文件中函数定义的模板签名。您在 SFINAE 的 class 中使用了第二个模板参数,因此您还必须在定义中指定该模板参数:
template<typename T, typename U> // note the 2nd parameter
Poco::JSON::Object::Ptr MapToJsonConvertor<T, U>::Convert(const std::string &rootName)
{
...
}
我正在尝试使用 SFINAE 编写模板 class 以将地图转换为 json,反之亦然。这个想法是将 class 限制为具有整数值类型或可转换为 int 的映射,即枚举,但我在编译 class.
时遇到问题到目前为止,这是我的代码:
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: error: invalid use of incomplete type ‘class MapToJsonConvertor<T>’ Poco::JSON::Object::Ptr MapToJsonConvertor<T>::Convert(const std::string &rootName)
^
In file included from ../src/Common/MapToJsonConvertor.cpp:9:0: ../src/Common/MapToJsonConvertor.h:21:7: note: declaration of ‘class MapToJsonConvertor<T>’ class MapToJsonConvertor ^
我正在使用 Poco 库进行 Json 构建。
我对使用 SFINAE 进行模板元编程还很陌生,所以我希望得到一些帮助。我做错了什么?
所以首先,模板应该按照说明在头文件中实现here。
除此之外,您的问题还在于源文件中函数定义的模板签名。您在 SFINAE 的 class 中使用了第二个模板参数,因此您还必须在定义中指定该模板参数:
template<typename T, typename U> // note the 2nd parameter
Poco::JSON::Object::Ptr MapToJsonConvertor<T, U>::Convert(const std::string &rootName)
{
...
}