Квалифицированные имена в объявлении класса C++
Согласно этой странице, имя класса может быть "опционально определено". Таким образом, я ожидаю компиляции следующего кода:
struct ::globalSt {};
В MSVC 2013u4 я получаю сообщение об ошибке:
Ошибка 1 ошибка C2039: "globalSt": не является членом "глобального пространства имен"
Я неверно истолковываю ссылку или это ошибка MSVC?
2 ответа
Если вы определяете класс с определенным именем, имя должно быть предварительно объявлено. [Класс]/11
Если class-head-name содержит спецификатор вложенного имени, спецификатор класса должен ссылаться на класс, который был ранее объявлен непосредственно в классе или пространстве имен, на которые ссылается спецификатор вложенного имени, или в элементе встроенный набор пространств имен (7.3.1) этого пространства имен (т. е. не просто унаследованный или введенный объявлением использования), а спецификатор класса должен появиться в пространстве имен, включающем предыдущее объявление. В таких случаях спецификатор вложенного имени класса- заголовка определения не должен начинаться со спецификатора decltype.
Чтобы это работало, класс должен быть уже удален. Если вы положите struct globalst;
где-то в вашем коде до вашего определения он будет работать нормально.
Например, если вы делаете
struct MyStruct;
тогда делай
struct ::MyStruct {};
это должно скомпилироваться.
Протестировано с MSVC 2013.