Квалифицированные имена в объявлении класса 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.

Другие вопросы по тегам