把这个枚举传递给CTOR有什么不对?

时间:2017-02-14 14:41:22

标签: c++ class enums init

我的code

#include <iostream>

enum EnvelopeMultiPointsType {
    ENVELOPE_MULTI_POINTS_TYPE_NORMAL = 0,
    ENVELOPE_MULTI_POINTS_TYPE_KICK_PITCH,
    kNumEnvelopeMultiPointsTypes
};

class EnvelopeMultiPoints
{
public:
    EnvelopeMultiPoints(EnvelopeMultiPointsType type) : mType(type) { 
        std::cout << mType << std::endl;
    }
    ~EnvelopeMultiPoints() { };

private:
    EnvelopeMultiPointsType mType;
};

class Test
{
public:
    Test() { };
    ~Test() { };

private:
    EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL);
};

int main()
{
    Test test;
}

似乎我无法使用该枚举初始化一个类。不知道为什么。我在这里错过了什么?

在线编译器说没有命名的类型&#39; ENVELOPE_MULTI_POINTS_TYPE_NORMAL&#39;在&EnvelopeMultiPointsType&#39; 中,但它在上面声明。

2 个答案:

答案 0 :(得分:5)

这一行

EnvelopeMultiPoints mEnv(EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL);

被解析为函数mEnv的声明,它返回EnvelopeMultiPoints并将不存在的EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL类型的1个变量作为单个未命名参数。

将此变量初始化为:

EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL;

答案 1 :(得分:2)

当你想要做内联初始化成员变量时,你必须使用大括号或等于初始化。

即。任

// Use braces
EnvelopeMultiPoints mEnv{EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL};

或者

// Use equal
EnvelopeMultiPoints mEnv = EnvelopeMultiPointsType::ENVELOPE_MULTI_POINTS_TYPE_NORMAL;

这是一种防止the most vexing parse含糊不清的方法。

阅读,例如this member initialization reference了解更多信息。