枚举作为模板

hid*_*yat 5 c++ enums templates

这就是我想要做的:

enum MyEnum
{
    ONE = 1, TWO, THREE
};

template<class T>
void func()
{
    cout << T::TWO << endl;
}

int main()
{
    func<MyEnum>();
};
Run Code Online (Sandbox Code Playgroud)

它有效,但我收到警告:"警告C4482:使用非标准扩展名:enum'MyEnum'用于限定名称"

如何在不收到警告的情况下执行此操作

mka*_*aes 5

Enum在这里有点棘手.ONE和TWO类型将位于外部名称空间中.因此,将名称添加到名称会导致警告.你可以删除限定符

template<class T>
void func()
{
    cout << TWO << endl;
}
Run Code Online (Sandbox Code Playgroud)

由于TWO在外部名称空间中是已知的.你也可以将你的枚举移动到某种封闭的结构.

struct EnumContainer
{
    enum MyEnum
    {
        ONE = 1, TWO, THREE
    };
};

template<class T>
void func()
{
    std::cout << T::TWO << std::endl;
}

int main()
{
    func<EnumContainer>();
};
Run Code Online (Sandbox Code Playgroud)

现在编译器应该没问题.

  • 在C++中,你有`enum struct MyEnum {ONE,TWO};`,请参阅http://en.wikipedia.org/wiki/C%2B%2B0x#Strongly_typed_enumerations (2认同)