Я должен поместить код от .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
}
Спасибо.
Я считаю более подходящим окружить весь код, который должен находиться в пространстве имен, в пространстве имен блоком {...}
, поскольку это семантически то, что вы делаете: вы определяете элементы в пространстве имен a
. Но если вы определяете только членов, то и то, и другое будет работать.
Когда компилятор находит void my :: foo ()
, он пытается определить, что такое my
, и найдет с помощью :: 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 <<
объявлен, но никогда не определен в пространстве имен a
. Он скомпилирует, но не свяжет ваш код.
Если я правильно понял вопрос, вы можете просто использовать :: my, а затем просто реализовать такие методы, как
using a::my;
void my::doSomething() {}
Вы можете это сделать. Но должен ли вам?
Это необычная практика, и она, вероятно, приведет к распространению с использованием :: Type;
для каждого типа из пространства имен 'a', используемого в файле .cc. Вам решать, хорошо ли это, но я бы проголосовал против :)