【问题标题】:map [] operand doesn't work c++map [] 操作数不起作用 C++
【发布时间】:2015-11-28 10:24:01
【问题描述】:

嗨,我的代码看起来像这样

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<:basic_string>, State* (*)()>()’和‘std::string {aka std::basic_string}')

据我所知,类型匹配,所以我不太明白为什么会出错

编辑: 我将这条线 static std::map&lt;std::string, createFunc&gt; registery() 固定为 static std::map&lt;std::string, createFunc&gt; registery; 但知道我得到另一个错误:

对 `StateRegistry::registry' 的未定义引用

【问题讨论】:

  • 你的意思是写static std::map&lt;std::string, createFunc&gt; registery;
  • 我不明白反对意见。这个问题与被错误消息混淆的 OP 一样清楚,如果关于 SO 的每个问题都有一个像这样清晰准确的例子,我会非常高兴。我很乐意给它不止一个 +1。

标签: c++ c++11


【解决方案1】:
   static std::map<std::string, createFunc> registery()

这是一个函数的声明,虽然分号不见了,我不知道为什么编译器让你这样做。

错误信息还告诉你类型实际上不匹配:

std::map<:basic_string>,State* (*)()>()

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

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

【讨论】:

  • 我删除了 () 并添加了 ;相反,但现在我收到一个链接器错误:未定义对 `Registery::registery' 的引用
  • @CforLinux 那是因为你只声明了静态成员。你也需要定义它。
  • @user2079303 在创建实例时?有没有办法创建一个不需要实例的类变量?
  • 根据定义,所有类数据成员都是某种类型的实例。如果声明为static,则需要单独定义。如果不是静态的,则该类的每个实例都包含其每个成员的一个实例——这些成员在对象的构造过程中被初始化。
【解决方案2】:

您的静态 'registery' 仅被声明但未定义。为了解决这个问题,您可以将 '= {}' 附加到声明中以使其成为定义,或者添加定义语句,如 'std::map<:string createfunc> Registery::registery;' 到您的代码中。

【讨论】:

    猜你喜欢
    • 2010-12-12
    • 2017-02-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多