派生的和专用的模板类,彼此包含

时间:2012-06-29 08:33:10

标签: c++ templates

我在标题(已编辑)中包含此代码:

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>’

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 {};