Вопрос

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

namespace ns { class A {}; }

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

Это было полезно?

Решение

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

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

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

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

Другие советы

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

namespace ns {
    class A;
}

class ns::A {
};

Или

namespace ns {
    class B;
}

using ns::B;
class B {
};

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

  

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

     

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

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

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

  

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top