gpt4 book ai didi

c++ - 为什么用作嵌套成员的非模板类是不完整类型?

转载 作者:行者123 更新时间:2023-12-02 09:47:34 26 4
gpt4 key购买 nike

#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是模板,定义类型为ANested直到 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/

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