【问题标题】:C++ Assign std::map values with enum class objectC++ 用枚举类对象分配 std::map 值
【发布时间】:2018-10-01 12:01:37
【问题描述】:

考虑以下代码。 在我的真实案例中,我有类似的情况:

typedef enum
{
    vehicle,
    computer,

} Article;

这就是我想要构建的:

enum class status{
    notPaid,
    paid,
};


struct S {
    status status_vehicle;
    status status_computer;

    std::map<Article, status> mymap =
    {
        {vehicle,  S::status_vehicle},
        {computer, S::status_computer},
    };
};

int main ()
{   
    Article a1 = vehicle;
    S::mymap.at(a1) = status::paid; // this line doesn't work
}

但是,最后一行 (S::mymap.at(a1) = status::paid;) 不起作用。我尝试了不同的方法,例如使用std::mapfind() 函数。我收到错误“在只读对象中分配成员 std::pair&lt;Article, status&gt;::second”。

有人知道,该怎么做吗?还有可能如何以更好的方式设计整体? (从“这就是我正在尝试构建的”这一行的全部内容)。 此外,我更愿意使用unordered_map 而不是map,但它不起作用。谢谢

【问题讨论】:

  • 您确定这是正确的代码吗?我得到“致命错误:非静态数据成员'mymap'的无效使用”,这更有意义。

标签: c++ c++11 enums typedef unordered-map


【解决方案1】:

因为mymap 不是静态的。

你可以这样做:

Article a1 = vehicle; 
struct S mystruct;
mystruct.mymap.at(a1) = status::paid;  

或者将static添加到struct中的成员:

struct S {
    status status_vehicle;
    status status_computer;

    static std::map<Article, status> mymap;
};

但是当使用静态时,你必须在struct S的声明之外初始化mymap和你不能使用结构的非静态成员的成员

std::map<Article,status> S::mymap={
    {vehicle,S::status_vehicle}
};

类的所有对象都共享一个静态成员。所有静态数据 在创建第一个对象时初始化为零,如果没有其他对象 初始化存在

在你的例子中逻辑上不好

https://en.cppreference.com/w/cpp/language/static

【讨论】:

  • 请引用或改写您链接中的相关信息。仅链接的答案既麻烦又不稳定。
  • 你不能在那里使用名称'struct',因为'struct'是一个保留字。
【解决方案2】:

由于myMap 是非静态的,它不能像静态变量那样赋值。 您可以像这样更改代码:

int main ()
{   
    Article a1 = vehicle; 
    S ss;
    ss.mymap.at(a1) = status::paid;    
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-06
    • 1970-01-01
    • 2021-11-21
    • 2015-09-21
    • 2020-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多