Доступ к вложенным членам класса на C++11
В C++11 я пытаюсь получить доступ к переменной-члену включающего класса из вложенного класса следующим образом:
struct Enclosing {
int a;
struct Nested {
int f() {
return a;
}
};
};
Даже это не компилируется с использованием g++4.7.2 с -std= C++11, создавая сообщения об ошибках этой формы:
error: invalid use of non-static data member 'Enclosing::a'
Насколько я понимаю, C++11 рассматривает вложенный класс как член класса, так что предположительно вложенный класс может получить доступ к любому другому члену включающего класса. Я сделал что-то неправильно? Заранее спасибо.
Обновить:
Хотя на мой вопрос, похоже, есть ответ ниже, я не уверен, что он будет помечен как дубликат.
Мне известны дискуссии о взаимосвязи между вложенными классами и вложенными классами до появления стандарта C++11, после долгих поисков до публикации вопроса.
Предыдущие соответствующие обсуждения, подобные этому, приводят некоторые "обновления" в C++11, например, доступность вложенных классов C++.
Но было не очень ясно, по крайней мере из ответов, которые я прочитал, в полной мере, что C++11 "отличается" от более старых версий по этому вопросу.
Технически решение моего вопроса существует в более старых потоках, таких как вложенные классы "доступ к закрывающим классам" закрытым членам данных, на этот факт необходимо указать, каким бы бессмысленным он мне ни казался. Но я не пришел ни с каким таким ответом, который помещает C++11 в контекст; по крайней мере, я не думаю, что мой вопрос можно считать "дубликатом" вопроса, заданного до стандарта C++11.
2 ответа
Чтобы закрыть этот вопрос, я приму это как ответ:
"Нет, он не рассматривается как член класса, он просто находится внутри него, как и все остальное. Вам понадобится экземпляр Enclosing для доступа к его членам".
- этот и несколько других комментариев касаются проблемы в моем коде. В основном это то, что остается верным для C++11.
Вот изменение в C++11 от cppreference;
Объявления во вложенном классе могут использовать только имена типов, статические члены и перечислители из включающего класса (до C++11)
Объявления во вложенном классе могут использовать любые члены включающего класса, следуя обычным правилам использования для нестатических членов. (начиная с C++11)
int x,y; // globals
class enclose { // enclosing class
int x; // note: private members
static int s;
public:
struct inner { // nested class
void f(int i) {
x = i; // Error: can't write to non-static enclose::x without instance
int a = sizeof x; // Error until C++11,
// OK in C++11: operand of sizeof is unevaluated,
// this use of the non-static enclose::x is allowed.
s = i; // OK: can assign to the static enclose::s
::x = i; // OK: can assign to global x
y = i; // OK: can assign to global y
}
void g(enclose* p, int i) {
p->x = i; // OK: assign to enclose::x
}
};
};
Вкратце, в C++11 вложенный класс может ссылаться на типы и статические члены своего включающего класса. Кроме того, он может ссылаться на нестатические члены только тогда, когда объект вложенного класса передается вложенному классу. Вложенный класс имеет доступ к членам своего класса, включая закрытые.