Дай угадаю.Я думаю, что вам интересно, потому что foo
сделан protected
, и, следовательно, вы думаете, что следующая строка должна выдавать ошибку, поскольку она пытается вызвать непубличный конструктор извне.
foo foo::ms_oFooStaticObject; //definition lies outside the class
Ну, это не правда.ms_oFooStaticObject
НЕ является глобальным объектом, хотя поначалу он кажется таким, поскольку его определение находится за пределами класса.
Дело в том, что ms_oFooStaticObject
является все еще членом класса, даже если его определение находится за пределами класса.И, как любой член, он может иметь доступ не только к protected
членам, но и к private
членам:
class A
{
A() { cout << "constructed" << endl; } //private constructor
static A a;
};
A A::a; //okay - member has access to private constructor!
A b; //error - non-member doesn't has access to private constructtor
Скомпилировать и увидеть сообщение об ошибке вместе с номером строки: http://www.ideone.com/qocH0
Кстати, ваш main()
нестандартный, он должен быть одним из следующих:
int main();
int main(int argc, char *argv[]);