繁体   English   中英

对带有 std::map 的 class 无效使用不完整类型<int, t>成员</int,>

[英]Invalid use of incomplete type for class with std::map<int, T> member

我正在尝试使用 SFINAE 编写模板 class 以从 map 转换为 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: 错误:无效使用不完整类型'class MapToJsonConvertor<T>' Poco::JSON::Object::::Convert:B54BZ::Ptr MapToson:B54BZ::::Convert( :string &rootName)
^
在来自../src/Common/MapToJsonConvertor.cpp:9:0 的文件中:../src/Common/MapToJsonConvertor.h:21:7:注意:'class MapToJsonConvertor<T>'的声明 class MapToJsonConvertor ^

我正在使用 Poco 库来构建 Json。

我仍然是 SFINAE 模板元编程的新手,所以我希望能得到一些帮助。 我究竟做错了什么?

所以首先,模板应该在 header 文件中实现,如此所述。

除此之外,您的问题在于源文件中 function 定义的模板签名。 您在 SFINAE 的 class 中使用了第二个模板参数,因此您还必须在定义中指定该模板参数:

template<typename T, typename U> // note the 2nd parameter
Poco::JSON::Object::Ptr MapToJsonConvertor<T, U>::Convert(const std::string &rootName)
{
    ...
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM