我在标题(已编辑)中包含此代码:
template <int i> class A {};
template <> class A <1> { B<1> _b; };
template <int i> class B : public A <i> {};
template <> class B <1> : public A <1> {};
并以某种方式使用它:
#include "template_A_B.h"
int main ()
{
A<1> a;
B<1> b;
return 0;
}
显然我收到了编译错误:
error: ‘B’ does not name a type
如果我添加B的前向声明
template <int i> class B;
我得到了
error: field ‘_b’ has incomplete type
编译时。
我也尝试过声明A并切换类定义的顺序并得到:
error: declaration of ‘struct A<1>’
答案 0 :(得分:2)
在你的问题的原始表述中,你只需要在你的前瞻声明之后加入你的专业。然后一切都会得到正确解决。
template <int i> class A;
template <int i> class B;
template <> class A <1> {};
template <> class B <1> : public A <1> {};
template <int i> class A { B<1> _b; };
template <int i> class B : public A <i> {};
在修订后的问题中,您创建了一个试图包含自身的结构,即使使用非模板类型也不允许这样做。例如,您不能定义:
struct A { B b; };
struct B : public A {};
但是,如果您更改A
以使用B
的间接引用,则可以执行与您想要的内容接近的内容。
struct B;
struct A { B *b; };
struct B : public A {};