Доступ к вложенным членам класса на 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 вложенный класс может ссылаться на типы и статические члены своего включающего класса. Кроме того, он может ссылаться на нестатические члены только тогда, когда объект вложенного класса передается вложенному классу. Вложенный класс имеет доступ к членам своего класса, включая закрытые.

Другие вопросы по тегам