【问题标题】:Initialize map of enums to structures初始化枚举映射到结构
【发布时间】:2017-01-05 17:42:29
【问题描述】:

在 C++ 中,我试图将枚举值的 std::map 初始化为结构。

在头文件中:

enum ePrompts
{
    ePrompt1,
    ePrompt2,
    ...
};

enum eDataTypes
{
    eIntegers,
    eDoubles,
    ...
};

struct SomeInfo
{
    std::string text;
    eDataTypes type;
    float minVal;
    float maxVal;
};

std::map<ePrompts, SomeInfo> mInfoMap;

在cpp文件中:

void SomeClass::InitializeThis()
{    
    // I would like to have an approach that allows one line per entry into the map
    mInfoMap[ePrompt1] = (SomeInfo){"text1", eIntegers, 2, 9}; //Error: Expected an expression

    // Also tried
    SomeInfo mInfo = {"text1", eIntegers, 2, 9};
    mInfoMap[ePrompt1] = mInfo; // works
    mInfo = {"text2", eIntegers, 1, 5}; //Error: Expected an expression
}

我可能在这里遗漏了一些非常简单的东西,但我已经通过 Stack Overflow 进行了相当多的搜索,但没有找到任何人这样做的结果。任何帮助将不胜感激!

【问题讨论】:

    标签: c++ struct enums stdmap


    【解决方案1】:

    你的第一行有正确的想法。它只需要稍作改动:

    mInfoMap[ePrompt1] = SomeInfo{"text1", eIntegers, 2, 9};
    

    【讨论】:

    • 感谢您的反馈!通过此更改,我现在看到“SomeInfo”带有红色下划线,并带有错误“不允许使用类型名称”。有什么想法吗?
    • 很难说。我模拟了你拥有的确切代码,我没有收到任何错误。我正在使用 VS2015
    • 我将发布的内容复制到一个新的测试项目中,但仍然遇到相同的错误。我正在使用运行 .NET 框架 4.5 的 VS2012。是不是这个语法太新了,还是……?
    • 是的,这是可能的。 2012 年的 C++11 实现并不完整。我建议尝试 VS2015 社区版。
    • 不幸的是,这不是我的选择。对于我工作的公司来说,这是一个非常大的项目,我们一直在使用我们正在使用的东西。谢谢你的帮助!我会尝试寻找其他解决方法。
    【解决方案2】:

    根据 C++ 标准(5.2.3 显式类型转换(函数表示法))

    3 类似地,simple-type-specifier 或 typename-specifier 后跟 一个花括号初始化列表创建一个指定类型的临时对象 直接列表初始化(8.5.4),带有指定的花括号初始化列表, 它的价值是作为prvalue的临时对象

    那就写吧

    mInfoMap[ePrompt1] = SomeInfo {"text1", eIntegers, 2, 9}; 
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-14
      • 1970-01-01
      • 2012-09-15
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多