#c #class #oop
#c #класс #ооп
Вопрос:
#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::Nested::A' is private within this context.
Как переопределить вложенный setnested(int x)
вне класса?
Ответ №1:
Этот код работает хорошо, но если я устраняю шаблонный признак включения класса, появляются ошибки.
На самом деле, та же ошибка относится и к версии шаблона, просто спецификатор доступа A
не проверяется, пока setnested
не будет создан экземпляр.
Если вы добавите эти строки в main
:
Enclosing<int,int> e;
e.setnested(42);
вы получаете ту же ошибку.
Один из способов исправить это — подружиться Enclosing
Nested
с, например, так:
class Nested {
friend class Enclosing;
// ...
};
Вот демонстрация.
Как переопределить вложенный setnested(int x) вне класса?
template <class T, class U>
auto Enclosing<T, U>::setnested(int x) -> Nested {
Enclosing::Nested* temp;
temp->A->x=5;
return *temp;
}
Вот демонстрация.