如何在不需要实例化派生类的情况下管理一组派生类枚举?

时间:2017-06-14 19:07:49

标签: c++ templates inheritance gcc crtp

我试图理解为什么下面的代码片段无法编译:

template <class Derived> struct Base {
    const std::set<typename Derived::Foo> types() const { return theSet; }
    std::set<typename Derived::Foo> theSet;
};

struct Derived : Base<Derived> {
    enum Foo { X,Y,Z };
};

int main(int argc, char** argv) { Derived x; return 0; }

我收到一条错误消息,指出types() const行是对struct Derived的无效使用 - 但需要知道的是该集的类型是Foo枚举所以我不确定我是否理解错误,或者是否有办法绕过它并不需要我制作int类型的集合..

编译器的完整错误说:

error: invalid use of imcomplete type 'struct Derived'
    const std::set<typename Derived::Foo> types() const {
error: forward declaration of 'struct Derived'
struct Derived : Base<Derived>

1 个答案:

答案 0 :(得分:0)

要编译此示例,编译器将需要嵌套类型的前向声明,这似乎不可能(请参阅How do I forward declare an inner class?),因此最简单的解决方法可能是使Base类采用两个模板并移动你的班级定义中Foo

#include <set>

template <class T, typename F> struct Base
{
    const std::set<F> types() const { return theSet; }
    std::set<F> theSet;
};

enum class Foo { X,Y,Z };

struct Derived : Base<Derived, Foo>
{
};

int main(int argc, char** argv)
{
    Derived x; return 0;
}