gpt4 book ai didi

c++ - 模板调用彼此的功能

转载 作者:太空宇宙 更新时间:2023-11-04 16:21:50 26 4
gpt4 key购买 nike

所以,我有一组相当简单的模板,我想一起使用,但编译器一直告诉我 B::a 的类型不完整。一切都向前声明,但它仍然不起作用......

#include <iostream>

using namespace std;

template <typename T> class A;
template <typename T> class B;

template <typename T>
class A{
public:
void ATestFunction();
void CallBFunction();
protected:
B<T> b;
};

template <typename T>
class B{
public:
void BTestFunction();
void CallAFunction();

protected:
A<T> a;
};

template <typename T>
void A<T>::ATestFunction(){
cout << "A was used for a function call" << endl;
}

template <typename T>
void B<T>::BTestFunction(){
cout << "B was used for a function call" << endl;
}


template <typename T>
void A<T>::CallBFunction(){
b.BTestFunction();
}

template <typename T>
void B<T>::CallAFunction(){
a.ATestFunction();
}

int main()
{
A<int> dragons;
dragons.CallBFunction();
return 0;
}

我问这个是因为我在编程一些相互依赖的数组类型类时遇到了一些困难(实现一个可以像这样访问的二维数组:[][]),但是这个问题发生了并且抛出了一个齿轮在作品中。我制作了这个测试程序,但它仍然失败。我在 Linux 上尝试了 MinGW 4.7.2 和 GNU g++,每个都给了我同样的问题。

最佳答案

从这段代码可以看出问题的核心:

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

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

C++ 是一种具有值语义的语言,这意味着 B<T> b;表示 B<T> 类型的对象(而不是引用,如 Java 或 C# 中的引用类型)。即 A<T> 包含一个B<T> .现在,如果您查看 B 的定义您看到的模板又包含一个 A<T>子对象。这基本上是不可能的,因为A<T>不可能包含包含 A<T> 的对象. A<T> 的大小是多少?对象?

在不知道要解决的真正问题的情况下,我不会冒险推荐一种方法,但您可以考虑使用指针( A<T> 将包含指向 B<T>指针,而不是完整的B<T> 子对象;或类似地,B<T> 可以包含指向 A<T>指针;或两者),或引用。但也可能是更深入的重新设计更有意义。

关于c++ - 模板调用彼此的功能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15800905/

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