所以,我有一组相当简单的模板,我想一起使用,但编译器一直告诉我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;
}
Run Code Online (Sandbox Code Playgroud)
我问这个是因为我在编写一些相互依赖的数组类型类时遇到了一些困难(实现了一个可以像这样访问的二维数组:[] []),但是这个问题发生了并且在工作中投入了一个装备.我做了这个测试程序,但它仍然失败了.我在Linux上尝试过MinGW 4.7.2和GNU g ++,每个人都给了我同样的问题.
问题的核心可以在这段代码中看到:
template <typename T>
class A{
B<T> b;
};
template <typename T>
class B{
A<T> a;
};
Run Code Online (Sandbox Code Playgroud)
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>;或两者)或参考.但也可能是更深层次的重新设计更有意义.
| 归档时间: |
|
| 查看次数: |
194 次 |
| 最近记录: |