Подтвердить что ты не робот

Определение класса в пространстве имен

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

namespace ns { class A {}; }

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

4b9b3361

Ответ 1

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

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

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

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

Ответ 2

Вы можете это сделать, но это не более succint.

namespace ns {
    class A;
}

class ns::A {
};

или

namespace ns {
    class B;
}

using ns::B;
class B {
};

Ответ 3

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

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

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

Обратите внимание на термин - декларация, так что D.Shawley(и его пример) верен.

Ответ 4

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

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

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