2015-04-22 4 views
4

Я хочу знать, можно ли инициализировать защищенный статический член из подкласса.
Например,
Инициализировать защищенный статический член из подкласса

// head file 
class Test 
{ 
protected: 
    static int i; 
}; 
class Test2 : public Test{}; 

//cpp file 
#include "headfile.h" 
int Test2::i = 1; 

Как вы видите, когда я инициализировать этот статический член (I), я использую имя подкласса (Test2).
К моему удивлению, я тестировал этот код с визуальной студией 2013 года, и он работал без ошибок. Но если бы я попробовал с Netbeans (gcc11) под Linux, и я получил ошибку намека:
unable to resolve the identifier i
Тогда я скомпилировал, сообщение об ошибке:
error: ISO C++ does not permit ‘Test::i’ to be defined as ‘Test2::i’ [-fpermissive]

Теперь, если я изменю защищаемую общественность static int i в классе Test, ошибка исчезнет.

Я запутался ... Это мой первый раз, когда я нашел два различных результата с НКУ и VS.

+0

Как вы протестировали его в визуальной студии? был ли тест/код идентичным тому, что вы делали в netbeans? Я бы подумал, что это ошибка, учитывая, что вы пытаетесь публично получить доступ к частной переменной. –

+0

@MarshallTigerus Я уверен, что это точно такой же код, потому что я его копирую. На самом деле я пробовал частный и защищенный, оба они не работали. ТОЛЬКО общественность работала. – Yves

+0

Clang по-прежнему не принимает его после изменения доступа 'i' к' public'. – chris

ответ

4

Определение нарушает C++ 14 [class.static.data] §9.4.2/2. Особое внимание мое:

In the definition at namespace scope, the name of the static data member shall be qualified by its class name using the :: operator.

Более поздняя версия GCC (на Coliru) ведет себя так же, независимо от классификатором. Вы можете победить ошибку в GCC с -fpermissive, но обратите внимание, что вы все еще определяете только один объект, принадлежащий базовому классу.

+0

ОК. Так что gcc точно соответствует новейшему стандарту, но vs не ..... – Yves

+1

@Thomas Я цитировал последнее издание стандарта, но правило совсем не новое. Точно такие же слова находятся в одном и том же абзаце с тем же номером раздела в C++ 98. – Potatoswatter

+0

достал тебя. большое спасибо. – Yves

Смежные вопросы