2

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

模板.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
};

主文件

#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++ 中是不可能的,那么有什么替代方法或解决方法?或者这可能是我的编译器的一个错误?

4

1 回答 1

7

您当前的设计包含一个严重的缺陷,称为循环依赖。它永远不会编译,修复它的最好方法是重新设计你的类层次结构。

为了给您提供它为什么永远无法编译的线索,让我们通过删除模板来简化情况:

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 个字节)。

注意:a指向in的指针/引用B是不必要的,因为A此时已经定义了,因此我们可以将它用作 in 的直接成员B

在您的情况下,您使用模板使事情变得更加复杂,虽然您可以利用建议的修复(使用指针/引用)并将其与模板结合起来,但我不推荐它。您的代码必须完全重新设计。

于 2013-04-25T03:02:08.300 回答