Насколько данное законно? Comeau online компилирует.
class a
{
class b;
};
class a::b
{
};
int main()
{
return 0;
}
-- Пользователи не приняли программу. Всех пришлось уничтожить. --
Здравствуйте, Аноним, Вы писали:
А>Насколько данное законно? Comeau online компилирует.
Ну, это уже о многом говорит
Да, это законно:
9.7/3
If class X is defined in a namespace scope, a nested class Y may be declared in class X and later defined in
the definition of class X or be later defined in a namespace scope enclosing the definition of class X.
[Example:
class E {
class I1; // forward declaration of nested class
class I2;
class I1 {}; // definition of nested class
};
class E::I2 {}; // definition of nested class
—end example]
Здравствуйте, Аноним, Вы писали:
А>Насколько данное законно? Comeau online компилирует.
А>А>class a
А>{
А> class b;
А>};
А>class a::b
А>{
А>};
А>
абсолютно законно, это стандартный прием для упрятывания реализации, дабы не тащить наружу типы, которые нужны только для реализации данного класса.
Здравствуйте, Аноним, Вы писали:
А>Насколько данное законно? Comeau online компилирует.
А>А>class a
А>{
А>class b;
А>};
А>class a::b
А>{
А>};
А>
Всё корректно.
Для вложенных классов нельзя делать форвард объявление — это да. А так вполне можно.
Такой приём часто применяют при реализации pimpl.
Здравствуйте, Bell, Вы писали:
B>Здравствуйте, Аноним, Вы писали:
А>>Насколько данное законно? Comeau online компилирует.
B>Ну, это уже о многом говорит
B>Да, это законно:
B>B>9.7/3
B>If class X is defined in a namespace scope, a nested class Y may be declared in class X and later defined in
B>the definition of class X or be later defined in a namespace scope enclosing the definition of class X.
B>[Example:
B>B>class E {
B> class I1; // forward declaration of nested class
B> class I2;
B> class I1 {}; // definition of nested class
B>};
B>class E::I2 {}; // definition of nested class
B>
B>B>—end example]
Спасибо за ссылку