0

可能重复:
使用 CRTP 和 typedef 的“继承”类型

template<typename T>
struct A {
  typename T::Sub  s;
};

struct B : A<B> {
  struct Sub {};
};

Clang 正在报告此错误:

todo.cc:3:15: error: no type named 'Sub' in 'B'
  typename T::Sub  s;
  ~~~~~~~~~~~~^~~
todo.cc:6:12: note: in instantiation of template class 'A<B>' requested here
struct B : A<B> {
           ^

我怎样才能让它工作?

4

2 回答 2

2

B是一个不完整的类,它请求实例化A<B>.

这意味着您只能B在模板方法中引用 on A,因为这些方法的实例化将延迟到B完成。

于 2012-07-23T17:07:19.577 回答
1

由于B继承自A<B>,A<B>必须在 is之前 B构造。

由于您使用的是 CRTP,这意味着它在构建B时是一个不完整的类。A<B>因此,编译器无法判断是否B有成员 field Sub,因此无法编译。

请注意,这一次 gcc 给出了一个更有意义的错误:

$猫crtp.cpp

template<typename T>
struct A {
      typename T::Sub  s;
};

struct B : A<B> {
      struct Sub {};
};

$ g++ -c crtp.cpp -o crtp.o

crtp.cpp: In instantiation of ‘A<B>’:
crtp.cpp:6:17:   instantiated from here
crtp.cpp:3:21: error: invalid use of incomplete type ‘struct B’
crtp.cpp:6:8: error: forward declaration of ‘struct B’
于 2012-07-23T17:15:53.220 回答