2013-09-15 1 views
2

Имеет ли значение следующий код?Внеуровневое определение базового класса «вложенный класс»

struct A 
{ 
    struct nested; 
}; 

struct B : public A {}; 

struct B::nested {}; 

НКУ принимает его, но лязг отвергает его со следующей ошибкой:

test.cpp:8:14: error: no struct named 'nested' in 'B' 
    class B::nested {}; 
      ~~~^ 
+0

Я не думаю, что частный «вложенный» класс A виден B. – franji1

+0

@ franji1: Я не думаю, что это имеет какое-либо отношение к видимости. Я изменил классы на структуры, и clang все еще отвергает его. – HighCommander4

ответ

6

Yup, это недействительно. Вот цитата.

Раздел 9 пункта 11, курсив мои:

If a class-head-name contains a nested-name-specifier, the class-specifier shall refer to a class that was previously declared directly in the class or namespace to which the nested-name-specifier refers, or in an element of the inline namespace set (7.3.1) of that namespace (i.e., not merely inherited or introduced by a using-declaration), and the class-specifier shall appear in a namespace enclosing the previous declaration. In such cases, the nested-name-specifier of the class-head-name of the definition shall not begin with a decltype-specifier.

В вашем примере, класс-голова-имяявляется лексемой B::nested, который включает в вложенного-имя-спецификаторB:: и класс-имяnested. Спецификатор - это все struct B::nested { ... }.

+0

Спасибо! Я зарегистрировал http://gcc.gnu.org/bugzilla/show_bug.cgi?id=58661. – HighCommander4

1

B не имеет вложенный класс с именем nested. только A имеет вложенный класс с именем должен нормально работать

0

Вы наследуете от A, так что вы не инкапсулированы nested struct in B.

От созданной структуры типа B можно только достигает структуру под названием nested, как она является частью структуры B, однако построить структуру имени nested отвечают A, потому что инкапсулированные nested.

Все в вашем коде недействительны.