【问题标题】:unordered_map key issue "expression must have integral or unscoped enum type"unordered_map 关键问题“表达式必须具有整数或无范围枚举类型”
【发布时间】:2013-09-20 22:04:00
【问题描述】:

我有这个:

unordered_map<string,string>* createDict(){

    unordered_map<string,string>* Dict= new unordered_map<string,string>();

    Dict["x"] = "a";
    Dict["y"] = "b";
    Dict["z"] = "c";

    return Dict;
}

我得到了错误:

表达式必须具有整数或无范围枚举类型

但这在堆栈上分配时有效。解决这个问题的最简单方法是什么?我真的不喜欢必须创建 Pair 对象才能插入到 unordered_map 中。

【问题讨论】:

  • 为什么不让函数返回一个unordered_map 而不是指向一个的指针?
  • @us2012 老实说我打算这样做,但这将是一个类的数据成员。
  • @user997112 为什么作为类的数据成员需要动态分配映射?
  • @user 我想知道您是否对在类A 中拥有对象成员变量和指针成员变量意味着什么有一些误解。你不需要仅仅因为你想动态分配A!类型的对象就需要一个指针成员变量

标签: c++ unordered-map


【解决方案1】:

Dict 是一个指向 std::unordered_map&lt;std::string, std::string&gt; 的指针,但您将它当作一个对象来使用。您需要适当地取消引用该对象,例如,使用

(*Dict)["x"] = "a";
Dict->operator[]("y") = "b";
std::unordered_map<std::string, std::string>& ref = *Dict;
ref["z"] = "c";

我更喜欢第一个选项或使用

Dict->insert(std::make_pair("x", "a"));

然而,它的语义略有不同:如果键存在,则在使用下标运算符时它不会做任何事情,而赋值会更新值。

【讨论】:

    【解决方案2】:

    解决这个问题最简单的方法是什么?

    使用通用初始化,只返回 unordered_map 而不是指针:

    #include <unordered_map>
    #include <string>
    
    std::unordered_map<std::string, std::string> createDict(){
        return {{"x", "a"}, {"y", "b"}, {"z", "c"}};
    }
    
    int main() {
      auto xyz_dict = createDict();
    }
    

    编辑:根据你的评论,这个数据结构将是某个类的成员变量,你可以在类中初始化它:

    struct A {
      using xyzDict = std::unordered_map<std::string, std::string>;
      xyzDict xyz_dict{{"x", "a"}, {"y", "b"}, {"z", "c"}};   
    };
    

    如果您的编译器不支持这一点,那么只需在构造函数的成员初始化列表中使用createDict() 初始化xyz_dict。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多