#include<iostream>
using namespace std;
template <class T>
class Enclosing {
private:
int x;
public:
class Nested {
Enclosing A ;
public:
void NestedFun() {
cout<<this->A.x;
}
};
};
int main()
{
Enclosing<int>::Nested temp;
return 0;
}
我试图声明一个内部类嵌套为封闭类型。在删除模板之前,代码仍然可以正常运行,出现一些错误,即field 'A' has incomplete type 'Enclosing'
和forward declaration of 'class Enclosing'
为什么会发生这种现象??? 最佳答案
当Enclosing
是模板时,在实例化A
之前,不需要在Nested
中定义Enclosing
的类型。当您这样做时:
Enclosing<int>::Nested temp;
此时,由于实例化发生在Enclosing
的定义之外,因此Enclosing
的定义已经完成,因此可以正常编译。另一方面,如果
Enclosing
不是模板,则在解析成员变量A
时(解析Enclosing
的定义时),编译器会抱怨您试图使用不完整类型的定义(这是正确的) ,因为您仍在A
的定义内)。您可以通过仅在
Nested
中声明Enclosing
,然后在Enclosing
之外定义它来解决此问题:class Enclosing
{
class Nested; // just declaration
// ...
}; // Enclosing is defined now
class Enclosing::Nested
{
Enclosing A; // now ok, because Enclosing definition is complete
// ...
};
这是demo。