c-两个模板类由彼此组成

我的代码中需要两个模板类由彼此的成员字段组成.例如,我有两个文件,

templates.h

template <class T> class B;

template <class T>
class A
{
    B<A> a;

    // fields and methods dependent on T
};

template <class T>
class B
{
    A<B> b;

    // fields and methods dependent on T
};

main.cpp中

#include "templates.h"

int main()
{
    A<int> a;
}

编译时,我收到此链接中显示的输出

http://pastebin.com/taBWZjar

我正在使用g编译器.当我输入g –version时,我得到

g++ (Gentoo 4.7.2 p1.3, pie-0.5.5) 4.7.2

如果在c中无法做到这一点,那么替代品或解决方案是什么?也许这是我的编译器的错误?

解决方法:

您当前的设计包含一个严重的缺陷,称为循环依赖.它永远不会编译,解决该问题的最佳方法是重新设计类层次结构.

为了让您知道为什么它永远无法编译,让我们通过删除模板来简化情况:

class B;

class A {
  B b;
};

class B {
  A a;
};

现在尝试将其视为编译器.要知道分配A类需要多少空间(并且编译器必须在编译时知道),它需要知道分配B类需要多少空间,反之亦然.显然,这是一个循环依赖性.您可以尝试自己编译它,然后看编译器抱怨它.

解决该问题的一种可能方法是切换到指针(或引用):

class B;

class A {
  B* b; // B& b; is possible too
};

class B {
  A a;
};

这样编译就可以了.原因是现在编译器知道b是一个指针,并且容纳该指针所需的空间是固定的(32位目标为4个字节,而64位目标为8个字节).

注意:B中没有对A的指针/引用,因为A已经在该点定义了,因此我们可以将其用作B中的直接成员.

在您的情况下,使用模板会使事情更加复杂,尽管可以利用建议的修复程序(使用指针/引用)并将其与模板结合使用,但我不建议这样做.您的代码必须完全重新设计.

上一篇:c-是否有一种方法可以解决模板函数的未定义引用错误,而无需在标头中实现它们?


下一篇:c-如何从类内部实例化的对象访问私有变量