如何使用在同一类的基模板中的类中声明的枚举

Posted

技术标签:

【中文标题】如何使用在同一类的基模板中的类中声明的枚举【英文标题】:How do I use an enum declared in a class in that same class's base's template 【发布时间】:2018-02-08 23:40:40 【问题描述】:

很抱歉这个冗长/过长的问题,但我不知道该怎么说。

我有课。此类扩展了模板化的基类。我想使用在派生类中声明的枚举作为模板参数之一。不是它的值,而是实际的枚举,尽管我怀疑这会有所作为。如果我尝试这样做,则会收到 C2065 未声明的标识符错误,例如在此简化示例中。

template<class Value>
class Base

 public:
    Value foo;


class Derived : public Base<Derived::Colors>

    enum Colors
    
        blue,
        red,
    

我试过环顾四周,发现如果枚举在一个类中,它们就不能向前声明,所以我不太知道该怎么做。不支持这样的用例似乎是一个很大的疏忽,那么有没有办法做到这一点?在我的实际代码中,我宁愿将此枚举保留在我的类中,因为它与其功能密切相关。

【问题讨论】:

枚举必须嵌套在派生类中吗? 是的,这是问题的一部分。 @ProgramGamer:但问题是为什么必须如此?以这种方式限制自己没有任何好处。尤其是强枚举。 将枚举和类放在自己的命名空间中(确保枚举在类之前)。否则,编译器无法在定义之前使用颜色,因为它是不完整的类型。 这听起来像是一个设计问题。基类不应依赖于派生类的细节。 【参考方案1】:

因此,事实证明,至少在 C++11 中是不可能做到这一点的。需要做类似的事情:

template<class Value>
class Base

 public:
    Value foo;


// Does not compile
enum Derived::Colors;

class Derived : public Base<Derived::Colors>

    enum Colors
    
        blue,
        red,
    

在将Colors 添加为模板参数之前要知道它。但是,由于前向声明与枚举一起使用,这是不可能的。基本上,如果它们在类内部声明,则标准明确禁止它们在该类外部前向声明。

【讨论】:

你总是可以在类外定义一个enum DerivedColors,在里面写using Colors = DerivedColors;

以上是关于如何使用在同一类的基模板中的类中声明的枚举的主要内容,如果未能解决你的问题,请参考以下文章

如何使用 SFINAE 为枚举类中的缺失值制作 polyfill?

如何在使用 prettier 的类中的方法声明前后添加新行?

如何在AJAX中调用.CS中的类

Java 中的抽象类及接口

继承与此类相同的基类的类的继承

如何在C#中,在一个类里调用另外一个类的方法