#include<iostream>
using namespace std;

template <class T, class U>
class Enclosing {
    private:
       int x;
    public:
    class Nested;

    Nested setnested (int x){
        Enclosing::Nested* temp;
        temp->A->x=5;
        return *temp;
    }

    class Nested {
        Enclosing *A  ;
        void NestedFun() {
        cout<<this->A->x;
        }
    };
};



int main()
{
  return 0;
}
这段代码运行良好,但是如果我消除了Enclosing类的模板符号,则会出现错误。
'Enclosing* Enclosing::Nested::A' is private within this context.
如何在类外覆盖嵌套的setnested(int x)

最佳答案


实际上,相同的错误适用于模板版本,只是在实例化A之前不检查setnested的访问说明符。
如果将这些行添加到main:

Enclosing<int,int> e;
e.setnested(42);
您得到相同的error

解决此问题的一种方法是使Enclosing成为Nested的 friend ,如下所示:
class Nested {
    friend class Enclosing;
    // ...
};
这是demo

template <class T, class U>
auto Enclosing<T, U>::setnested(int x) -> Nested {
    Enclosing::Nested* temp;
    temp->A->x=5;
    return *temp;
}
这是demo

关于c++ - 内部阶层的可及性,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/64305249/

10-12 15:05