C++模板交叉定义

C++ templates cross definition

本文关键字:定义 C++      更新时间:2023-10-16

我想知道是否可以C++这样做:

 template <typename T> class A { T link;};
 template <typename U> class B { U link;};
 class AA : A<BB> {};
 class BB : B<AA> {};

因为它会产生错误:

 error: ‘BB’ was not declared in this scope
 error: template argument 1 is invalid

我尝试使用预期声明:

 class AA;
 class BB;
 class AA : A<BB> {};
 class BB : B<AA> {};

但它没有用:

 In instantiation of ‘A<AA>’:
 error: ‘A<T>::s’ has incomplete type
 error: forward declaration of ‘struct AA’

谢谢你的帮助,

你的问题不在于模板,而在于无限嵌套(是的,从技术上讲,使用不完整的类型来定义成员)。删除模板,您会遇到同样的问题:

struct A;
struct B;
struct A { B x; };
struct B { A y; };

从概念上讲,这是行不通的。因为,真的,你在这里得到的是一个包含BA,其中包含一个包含BA......到无穷大。一路向下。

但是,起作用的是改用指针成员。它们适用于不完整的类型,因此代码有效 - 甚至模板。

template <typename T> class A { T* link;};
template <typename U> class B { U* link;};

看看我前段时间问的这个问题。如何转发声明模板类

基本上,如果要向前声明模板类型,则必须指定所有模板参数。