Использование пространств имен в C ++ - PullRequest
2 голосов
/ 09 июля 2010

Можем ли мы использовать пространства имен, как в приведенном ниже фрагменте?Код компилируется как в gcc, так и в msvc, и я не понимаю, как использовать пространство имен.

В f1.h:

namespace My
{
 void foo();
}

В f1.cpp `

void My::foo()
{
}

Я думал, что функцию следует определить как:

namespace My {
void foo() {}
}

Может ли кто-нибудь любезно объяснить?

Спасибо

Ответы [ 5 ]

8 голосов
/ 09 июля 2010

Допустимо определять члены пространства имен вне их пространства имен, если их имя начинается с имени их пространства имен, а определение фактически происходит в пространстве имен, которое его охватывает. Это не может произойти в пространстве имен, которое вложено в пространство имен члена.

namespace A { void f(); }
void A::f() { } // prefix with "A::"

namespace B { }
void B::f() { } // invalid! not declared in B!

namespace C { void f(); }
namespace D { void C::f() { } } // invalid! D doesn't enclose C

namespace E {
  void f();
  namespace F {
    void E::f() { } // invalid! F is nested inside E!
  }
}

Это то же самое, что и для членов класса, где вы также можете определять функции вне их класса, если вы добавляете имена к имени класса. Однако, что касается классов, члены пространства имен должны быть сначала объявлены в их соответствующем пространстве имен, прежде чем они могут быть определены вне его.

0 голосов
/ 09 июля 2010

Мне нравится, что это разрешено:

namespace My
{
 void foo();
}

Поскольку это означает, что если служебный метод довольно длинный, он не загромождает заголовочный файл. Таким образом, более очевидно, какие методы предоставляются в пространстве имен.

Я знаю, что это может быть пустой точкой с выразительностью современных IDE, но все равно помогает иметь чистые заголовочные файлы.

0 голосов
/ 09 июля 2010

оба верны

Вы можете установить пространство имен глобально или для каждой функции

namespace My {
//in this are functions are in "My" namespace
}

namespace Your {
//in this are functions are in "Your" namespace
}

My::foo() {}
My::bar() {}
Your::foo() {}

если вы не хотите писать «My ::» в начале каждой функции, вы пишете это как первую. вторая полезна, когда существует более одного пространства имен

0 голосов
/ 09 июля 2010

Это то же самое, что и: использование пространства имен std; сверху и просто делать cout вместо того, чтобы делать std :: cout. Оба будут работать и оба действительны, но вы должны подумать о том, как их использовать. Есть плюсы и минусы.

0 голосов
/ 09 июля 2010

Да, все в порядке. Делая «My ::», вы указываете, что используете пространство имен «My».

Так же, как вы можете объявить вектор STL как "std :: vector " ...

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