Элемент x
и y
являются нестатическими членами данных Enclosing
, что означает, что они существуют только в конкретном объекте класса Enclosing
. Без конкретного объекта не существует ни x
, ни y
. Тем временем вы пытаетесь сослаться на x
и y
без объекта. Это не может быть сделано, о чем вам и говорит компилятор.
Если вы хотите инициализировать элементы Inner::foo
и Inner::bar
из x
и y
, вам нужно передать конкретный объект типа Enclosing
в конструктор Inner
s. Например
class Enclosing::Inner {
explicit Inner(const Enclosing& e) : foo(e.x), bar(e.y)
{}
//...
};
Дополнительное примечание: в исходном C ++ 98 внутренний класс не имеет особых привилегий доступа к внешнему классу. С компилятором C ++ 98 вы должны либо дать внутреннему классу необходимые привилегии (дружба), либо выставить члены x
и y
как общедоступные. Однако эта ситуация была классифицирована как дефект в C ++ 98, и было решено, что внутренние классы должны иметь полный доступ к внешним членам класса (даже частным). Итак, нужно ли вам что-то делать с правами доступа, зависит от вашего компилятора.