#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 .
关于c++ - 为什么用作嵌套成员的非模板类是不完整类型?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/64306452/