我的代码中需要两个模板类由彼此的成员字段组成.例如,我有两个文件,
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
};
Run Code Online (Sandbox Code Playgroud)
main.cpp中
#include "templates.h"
int main()
{
A<int> a;
}
Run Code Online (Sandbox Code Playgroud)
当我编译时,我收到此链接中显示的输出
我正在使用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;
};
Run Code Online (Sandbox Code Playgroud)
现在尝试将其视为编译器.要知道分配类需要多少空间A(并且编译器必须在编译时知道它),它需要知道分配类需要多少空间B,反之亦然.显然,这是一种循环依赖.你可以尝试自己编译它,看看编译器抱怨它.
解决这个问题的一种可能方法是切换到指针(或引用):
class B;
class A {
B* b; // B& b; is possible too
};
class B {
A a;
};
Run Code Online (Sandbox Code Playgroud)
这应该编译得很好.原因是现在编译器知道它b是一个指针,并且容纳该指针所需的空间是固定的(32位目标为4个字节,相应地为64位目标为8个字节).
注:指针/参考a在B因为不需要A在该点已定义,因此,我们可以把它作为在直接构件B.
在您的情况下,您可以使用模板进一步复杂化,虽然您可以利用建议的修复(使用指针/引用)并将其与模板结合使用,但我不推荐它.您的代码必须完全重新设计.