map []操作数不起作用c ++

时间:2015-11-28 10:24:02

标签: c++ c++11

我的代码看起来像这样

class State
{
public:
    State * create(void);
};

typedef State * (*createFunc)(void);
class Registery
{
private:
   static std::map<std::string, createFunc> registery()
public:
   static void register_func(std::string key, createFunc func)
   {
       registery[key] = func;
   }
   static State * create(std::string key)
   {
       return registery[key]();
   }
};

int main()
{
   Registery::register_func("state", State::create);
   State * s = Registery::create("state");
}

问题是,当我尝试编译它时,我收到此错误:

  

错误:'operator []'不匹配(操作数类型为   “的std ::地图&LT;的std :: basic_string的&LT; char&gt;,State *(*)()&gt;()'和'std :: string   {aka std :: basic_string&lt;炭&GT;}”)

据我所知,这些类型匹配,所以我不明白为什么会有错误

编辑: 我已将此行static std::map<std::string, createFunc> registery()修改为static std::map<std::string, createFunc> registery; 但是知道我得到了另一个错误:

  

对StateRegistry :: registry&#39;

的未定义引用

2 个答案:

答案 0 :(得分:4)

   static std::map<std::string, createFunc> registery()

这是函数的声明,虽然缺少分号,但我不确定为什么编译器会让你这样做。

错误消息也告诉您类型实际上不匹配:

  

的std ::地图&LT;的std :: basic_string的&LT; char&gt;,State *(*)()&gt;()

最后一个()表示该类型描述了一个不带参数的可调用。

您需要从()声明中删除registery,然后添加;

答案 1 :(得分:0)

您的静态“注册”仅被声明但未定义。要解决此问题,您可以将“ = {} ”附加到声明中以使其成为定义,或者添加定义语句,例如' std :: map&lt; std :: string, createFunc&GT; Registery :: registery; '代码。