【问题标题】:enum as template枚举作为模板
【发布时间】:2011-02-10 14:03:56
【问题描述】:

这就是我想做的:

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

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

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

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

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

【问题讨论】:

  • enum E1 { ONE, TWO }; enum E2 { ONE, TWO }; 给出了“ONE 的冲突声明”,正如我所料 - enum E1 的值不会进入命名空间 E1。你在期待什么?
  • TWO 在您的MyEnum 中定义,它不是您所显示的类或命名空间的一部分。枚举不声明范围,因此不使用范围运算符解析。
  • 但这是我想做的,我希望能够同时传递 E1 和 E2 并在打印时获得不同的值
  • 那么你需要使用classstruct,而不是enum
  • 你用的是什么编译器?我见过的几乎每个 G++ 编译器 [linux 和 osx] 都会产生 T::TWO 错误

标签: c++ templates enums


【解决方案1】:

枚举在这里有点棘手。类型 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>();
};

现在编译器应该没问题了。

【讨论】:

【解决方案2】:

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

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

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

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

【讨论】:

    【解决方案3】:

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

    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;
    }
    

    希望对您有所帮助。

    【讨论】:

    • 他还可以将枚举声明为结构的成员,这样他就可以多次定义枚举(在不同的范围内)。虽然我会质疑为什么在大多数情况下这是可取的。
    • 我怀疑这个编译。 typename 用于类型,TWO 是需要类实例的属性....
    猜你喜欢
    • 1970-01-01
    • 2012-02-25
    • 2023-03-14
    • 2012-04-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-21
    相关资源
    最近更新 更多