枚举作为模板

时间:2011-02-10 14:03:56

标签: c++ templates enums

这就是我想要做的事情:

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

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

int main()
{
    func<MyEnum>();
};

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

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

3 个答案:

答案 0 :(得分:5)

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

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

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

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

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

int main()
{
    func<EnumContainer>();
};

现在编译器应该没问题。

答案 1 :(得分:1)

虽然使用枚举作为模板参数并让它在您编写时单独识别每个单独的枚举会很好,但它不会发生。相反,我可以建议您声明以下内容:

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

C ++的优点在于模板的结构方式为您提供了一个完整的系统。因此,您不需要像这样单独调用,因为您已声明获取每个单独的枚举值。您可以在需要时为每个值创建一个单独的函数,并且仅在您需要时

现在,回到你的问题的另一个问题,正如@delnan评论的那样,你不能拥有两个具有相同名称的不同枚举。但是,您可以拥有一个名为TWO的成员变量的类,以便:

struct Foo{
    int TWO;
};

struct Bar{
    int TWO;
};

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

希望有所帮助。

答案 2 :(得分:1)

枚举(前C ++ 0x)被视为整数类型。

实际上,符号MyEnum :: TWO是垃圾:没有类或命名空间MyEnum。名称ONE,TWO和THREE被引入定义枚举的命名空间[在本例中为全局命名空间]。

您应该收到类似TWO is not a member of MyEnum的错误。

模仿行为的一种方法是将其放在结构或类中,就像其他人建议的那样。