Корректна ли следующая программа в соответствии со стандартом С++?
namespace X { class A; }
namespace Y { using X::A; class A {}; }
int main() {}
Я получаю разные результаты с разными компиляторами:
- gcc компилирует без ошибок.
- Visual С++ выдает ошибку C2888: «X :: A»: символ не может быть определен в пространстве имен «Y»
Я не нахожу в стандарте С++ ни одного правила, которое нарушает моя программа.
Если программа правильно построена, то почему Visual Studio выдает ошибку?
Если программа неправильно сформирована, какое правило стандарта С++ она нарушила и почему gcc не выдает ошибку?
Я не пытаюсь компилировать свою программу. Я просто пытаюсь выяснить, правильно ли он сформирован в соответствии со стандартом С++ и почему два протестированных мной компилятора ведут себя по-разному.
X::A
иY::A
— это два разных типа; нет предварительного объявления и последующего определения. - person Kerrek SB   schedule 04.07.2015using ::X::A
? - person bweber   schedule 04.07.2015X::A a;
. Это должно быть неправильно сформировано, так какX::A
неполное. Возможно, GCC ошибается, отождествляя определениеY::A
с определениемX::A
. Clang отвергает этот код. - person Kerrek SB   schedule 04.07.2015enum A { FOO };
в пространство именY
. Теперь Clang его компилирует, а GCC жалуется, что ранее было объявленоA
. - person Kerrek SB   schedule 04.07.2015