我试图理解为什么下面的代码片段无法编译:
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>
答案 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;
}