Определение класса в пространстве имен - PullRequest
20 голосов
/ 08 марта 2009

Существует ли более краткий способ определения класса в пространстве имен, чем этот:

namespace ns { class A {}; }

Я надеялся, что что-то вроде class ns::A {}; сработает, но, увы, нет.

Ответы [ 4 ]

35 голосов
/ 08 марта 2009

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

namespace ns {
    class A; // just tell the compiler to expect a class def
}

class ns::A {
    // define here
};

То, что вы не можете сделать, это определить класс в пространстве имен без членов, а затем снова определить класс вне пространства имен. Это нарушает Правило Единого Определения (или некоторую глупость).

7 голосов
/ 08 марта 2009

Вы можете сделать это, но это не совсем лаконично.

namespace ns {
    class A;
}

class ns::A {
};

Или

namespace ns {
    class B;
}

using ns::B;
class B {
};
2 голосов
/ 08 марта 2009

Раздел, который вы должны прочитать, это:

7.3.1.2 Определения членов пространства имен

3 Каждое имя, впервые объявленное в пространстве имен, является членом этого пространства имен. [...]

Обратите внимание на термин - декларация, поэтому Д.Шоули (и его пример) верны.

0 голосов
/ 08 марта 2009

Нет, ты не можешь. Чтобы процитировать стандарт C ++, раздел 3.3.5:

Имя, объявленное вне всех имен или безымянные пространства имен (7.3), блоки (6.3), веселье (8.3.5), функция определения (8.4) и классы (пункт 9) имеет глобальную область имен

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

...