Форвард объявляющих классов в пространствах имен - PullRequest
14 голосов
/ 19 июля 2010

Я был довольно удивлен, узнав, что не смог переслать объявление класса из другой области видимости с помощью оператора разрешения области видимости, т.е.

class someScope::someClass;

Вместо этого полное объявление должно использоваться следующим образом:

namespace
{
    class someClass;
}

Может кто-нибудь объяснить, почему это так?

ОБНОВЛЕНИЕ: Чтобы уточнить, я спрашиваю , почему это так.

Ответы [ 3 ]

7 голосов
/ 19 июля 2010

Вы не можете объявить класс вне его пространства имен, потому что компилятор не может знать тип someScope .

требуется пространство имен {} чтобы объявить о существовании пространства имен, а затем объявить class someClass в вашей области видимости.

6 голосов
/ 22 июля 2010

Кажется, что ответ лежит в спецификации C ++:

3.3.5 "Область пространства имен" в стандарте.

Объекты, объявленные в теле пространства имен, называютсябыть членами пространства имен, а имена, введенные этими объявлениями в декларативную область пространства имен, называются именами членов пространства имен.

На элемент пространства имен также можно ссылаться после оператора разрешения :: scope(5.1) применяется к имени его пространства имен или имени пространства имен, которое назначает пространство имен члена в директиве using;

1 голос
/ 19 июля 2010

Я не уверен почему. Возможно, потому что в вашем первом фрагменте кода, someScope не объявлено. Это может быть пространство имен или имя класса. Если someScope является именем класса, вы не можете самостоятельно объявить члена класса другого класса.

...