我的代码看起来像这样
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;
的未定义引用
答案 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; '代码。