Неправильное использование неполного типа для класса с std :: mapчлен - PullRequest
0 голосов
/ 05 октября 2019

Я пытаюсь написать шаблонный класс, используя 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 :: Ptr MapToJsonConvertor :: Convert (const std :: string & rootName)^
В файле, включенном из ../src/Common/MapToJsonConvertor.cpp:9:0: ../src/Common/MapToJsonConvertor.h:21:7: note: объявление класса 'MapToJsonConvertor ' классаMapToJsonConvertor ^

Я использую библиотеки Poco для сборки Json.

Я все еще новичок в метапрограммировании шаблонов с SFINAE, поэтому я был бы признателен за некоторую помощь. Что я делаю не так?

1 Ответ

1 голос
/ 05 октября 2019

Итак, прежде всего, шаблоны должны быть реализованы в заголовочном файле, как объяснено здесь .

Кроме того, ваша проблема заключается в подписи шаблона вашего определения функции в исходном файле. ,Вы используете 2-й параметр шаблона в своем классе для SFINAE, поэтому вам необходимо также указать этот параметр шаблона в определении:

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