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

时间:2018-02-08 23:40:40

标签: c++ c++11

对于罗嗦/过长的问题感到抱歉,但我不知道怎么说这个。

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

template<class Value>
class Base
{
 public:
    Value foo;
}

class Derived : public Base<Derived::Colors>
{
    enum Colors
    {
        blue,
        red,
    }
}

我已经尝试过四处寻找,并发现如果枚举在一个类中是不可向前声明的,所以我不知道该怎么做。让这样一个用例不受支持似乎是一个非常大的疏忽,所以有没有办法做到这一点?在我的实际代码中,我宁愿将这个枚举保留在我的课程中,因为它与其功能密切相关。

1 个答案:

答案 0 :(得分:0)

因此,事实证明,至少在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添加为模板参数之前将其知晓。但是,由于前向声明与枚举一起使用的方式,这是不可能的。基本上,如果它们是在类中声明的,那么标准明确禁止它们在该类之外向前声明。