2010-04-11 88 views
6

我是否必須將.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 
} 

謝謝。

回答

4

我認爲更合適的是圍繞所有代碼在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 &)文件 - 不執行 - ,並在cpp文件中定義std::ostream& ::operator<<(std::ostream &, a::my const &),這是一個不同的功能。使用Koening查找,當編譯器看到cout << obja::myobj,編譯器會看在coutmystd,並且a)封閉的命名空間,並會發現有一個a::operator<<說明,但namespace a從未定義。它會編譯但不能鏈接你的代碼。

+0

+1。名稱空間中的內容在'namespace {}'中。像這樣的東西不要求縮進,所以沒有任何問題。 – Potatoswatter 2010-04-11 14:06:54

1

如果我理解正確的問題,你可以使用::我,然後就實施方法,如

using a::my; 

void my::doSomething() {} 
0

可以做到這一點有。但是,應該是嗎?

這是一種不常見的做法,它可能會導致來自.cc文件中使用的名稱空間「a」的每種類型的using a::Type;激增。是否這是一件好事是由你來決定的,但我會投反對票:)

+0

您還可以使用'using namespace a;'並實現代碼,而不需要在代碼中擁有大的名稱空間{}。名稱空間聲明用於標題。 – luiscubal 2010-04-11 13:39:11

相關問題