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

标签 c++ class templates

#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/

相关文章:

c++ - 作为重载运算符的函数包装器

c++ - 如何初始化常量字符串集

c++ - 如何从 C++ 中的文本文件中读取长行?

class - dart:对于语法专家,如何在嵌套类中交换子树

c++ - 使用 enable_if 的模板特化在 Clang 中失败,适用于 GCC

c++ - (Visual C++ v141) 按位函数编译不正确

javascript - 在 nav ul li h4 中使用 jQuery 添加/删除链接类

C#让多个类共享另一个类的同一个实例

c++ - 从模板类覆盖纯虚函数

c++ - 使用可变参数模板(gcc、clang)的成员函数指针包装器