gpt4 book ai didi

c++ - 两个模板类互为成员组成

转载 作者:行者123 更新时间:2023-11-30 00:36:18 25 4
gpt4 key购买 nike

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

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

主要.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++ - 两个模板类互为成员组成,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16205367/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com