映射 [] 操作数不起作用 C++

map [] operand doesn't work c++

本文关键字:不起作用 C++ 操作数 映射      更新时间:2023-10-16

hi我的代码看起来像这个

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::map<std::basic_string<char>,State*(*)()>()'和'std::string{又名std::basic_string<char>}’)

就我所能看到的类型匹配,所以我真的不明白为什么我有一个错误

编辑:我把这条线路static std::map<std::string, createFunc> registery()固定到static std::map<std::string, createFunc> registery;但我知道我得到了另一个错误:

对"StateRegistry::registry"的未定义引用

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

这是一个函数的声明,尽管缺少分号,我不知道编译器为什么让我们这样做。

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

std::映射<std::basic_string<char>,状态*(*)()>()

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

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

您的静态'寄存器'仅声明而未定义。要解决此问题,您可以将"={}"附加到声明中,使其也成为一个定义,或者添加一个定义语句,如"std::map<std::string,createFunc>注册处::Registery'添加到您的代码中。