#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

08-08 02:25