2010-07-09 5 views
2

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

В f1.h:

 
namespace My 
{ 
void foo(); 
} 

В f1.cpp `

 
void My::foo() 
{ 
} 

Я думал, что функция должна быть определена как:

 
namespace My { 
void foo() {} 
} 

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

Thanks

ответ

8

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

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

Какой путь более идиоматичен? – Philipp

+0

@Philipp i определяет встроенные функции непосредственно на месте и другие функции отдельно. Особенно, если есть разделение заголовка/реализации-файла. –

+0

Разве это не тавтология? Функции, определенные в определении класса, всегда являются строчными. Я имел в виду, следует ли определять автономные функции, используя 'A :: f' или' namespace A {f} '. По крайней мере, Boost, похоже, предпочитает последнее. – Philipp

0

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

Точно так же, как вы можете объявить вектор STL, как «станд :: вектор < Int>» ...

0

как верно

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

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 ::" в начале каждой функции, йо u напишите его как первый. второй полезен, когда имеется более одного пространства имен

0

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

0

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

namespace My 
{ 
void foo(); 
} 

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

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

Смежные вопросы