Это должно быть в пространстве имен?

Я должен поместить код от .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
}

Спасибо.

6
задан Johannes Schaub - litb 11 April 2010 в 13:35
поделиться

3 ответа

Я считаю более подходящим окружить весь код, который должен находиться в пространстве имен, в пространстве имен блоком {...} , поскольку это семантически то, что вы делаете: вы определяете элементы в пространстве имен 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 . Он скомпилирует, но не свяжет ваш код.

4
ответ дан 17 December 2019 в 04:44
поделиться

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

using a::my;

void my::doSomething() {}
1
ответ дан 17 December 2019 в 04:44
поделиться

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

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

0
ответ дан 17 December 2019 в 04:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: