模板专业化和std :: map

时间:2018-03-27 15:36:01

标签: c++ c++11

我尝试使用相应的文字和通话功能创建Code的地图。我收到编译错误,我无法弄清楚我的代码std::map初始化有什么问题。有人可以解释一下我做错了什么,我该如何解决这个问题:

#include <iostream>
#include <vector>
#include <string>
#include <functional>
#include <utility>
#include <map>

namespace mvs
{
    enum Code
    {
        Code0  = -1,
        Code1  = -2,
        Code2  = 1,

        CodeCount
    };
}

class CompositeFile
{
public:
    CompositeFile(std::string const& name) : name_(name) {}

    template <typename T>
    long readEx(mvs::Code code, std::vector<T>& buffer)
    {
         return 0;
    }

    std::string readString(mvs::Code code)
    {
        return {};
    }

private:
    std::string name_;
};

namespace mh
{
     class CompositeFileEx : public CompositeFile
     {
     public:
        CompositeFileEx(std::string const& name) : CompositeFile(name) {}

        template <typename T>
        std::string get(mvs::Code code)
        {
            std::vector<T> buffer;
            readEx(code, buffer);

            return {};
        }

    private:
        typedef std::pair<std::string, std::function<std::string(mvs::Code)> > pair_type;
         **std::map<mvs::Code, pair_type> map_ =
         {
             { mvs::Code1, { "Code1", get<char>(mvs::Code1) } }
         };**
     };

     template <>
     std::string CompositeFileEx::get<char>(mvs::Code code)
     {
         return readString( code );
     }
}

int main(int argc, char** argv)
{
    return 0;
}

1 个答案:

答案 0 :(得分:0)

仔细查看你的配对是如何定义的:

std::pair<std::string, std::function<std::string(mvs::Code)>>

第二个元素是std::function<std::string(mvs::Code)>。在构造对象时,您应该发送一个可调用对象作为对的第二个参数。

表达式get<char>(mvs::Code1)的类型不是一个可调用的对象,它将代码作为参数并返回一个字符串。表达式直接生成一个字符串。

要解决此问题,您应该发送一个lambda函数,该函数将代码作为参数,并返回get的结果