Должно ли оно быть в пространстве имен? - PullRequest
6 голосов
/ 11 апреля 2010

Нужно ли помещать код из .cpp в пространство имен из соответствующего .h или достаточно просто написать с помощью объявления?

//file .h
namespace a
{
/*interface*/
class my
{
};
}

//file .cpp

using a::my; // Can I just write in this file this declaration and
             // after that start to write implementation, or
             // should I write:

namespace a //everything in a namespace now
{
//Implementation goes here
}

Спасибо.

Ответы [ 3 ]

4 голосов
/ 11 апреля 2010

Я считаю более целесообразным окружить весь код, который должен находиться в пространстве имен, в блоке namespace a { ... }, поскольку это семантически то, что вы делаете: вы определяете элементы в пространстве имен a. Но если вы только определяете членов, тогда обе вещи будут работать.

Когда компилятор найдет void my::foo(), он попытается определить, что такое my, и найдет using a::my, разрешит my из этого и поймет, что вы определяете метод a::my::foo.

С другой стороны, этот подход потерпит неудачу, если вы используете бесплатные функции:

// header
namespace a {
   class my { // ... 
   };
   std::ostream & operator<<( std::ostream& o, my const & m );
}
// cpp
using a::my;
using std;
ostream & operator<<( ostream & o, my const & m ) {
   //....
}

Компилятор с радостью переведет приведенный выше код в программу, но фактически он объявляет std::ostream& a::operator<<( std::ostream&, a::my const & ) в заголовочном файле - без реализации - и определяет std::ostream& ::operator<<( std::ostream &, a::my const & ) в файле cpp, который является другая функция. Используя поиск Кенинга, всякий раз, когда компилятор видит cout << obj с obj типа a::my, компилятор будет искать во вложенных пространствах имен cout и my (std и a) и найдет что a::operator<< объявлено, но никогда не определено в namespace a. Он скомпилирует, но не скомпонует ваш код.

1 голос
/ 11 апреля 2010

Если я правильно понял вопрос, вы можете просто использовать :: my, а затем просто реализовать методы, например

using a::my;

void my::doSomething() {}
0 голосов
/ 11 апреля 2010

Вы можете сделать это.Но должен ты?

Это необычная практика, и она, вероятно, приведет к увеличению using a::Type; для каждого типа из пространства имен «a», используемого в файле .cc.Хорошо ли это решать вам, но я бы проголосовал против:)

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...