2011-03-06 58 views
0

我正在研究分成多個名稱空間的C++庫。由於我試圖避免頭文件中的「使用」指令,我不得不爲變量,返回值和參數做替代的「namespace :: class」。你可以想象這會變得混亂。所以,我嘗試將using語句放入命名空間decloration(見下文)中,這看起來有訣竅,它看起來並不在包含此文件的文件中可見。在標題中使用名稱空間可見性

namespace Project 
{ 
    namespace Utility { class A; } 

namespace System 
{ 
    using Utility::A; 

    class B 
    { 
     A *a; // instead of Utility::A *a 
    }; 
} 
} 

我的問題是,可以這樣做嗎?

回答

2
// your header 

namespace Project 
{ 
    namespace Utility { class A; } 

namespace System 
{ 
    using Utility::A; 

    class B 
    { 
     A *a; // instead of Utility::A *a 
    }; 
} 
} 

// end your header 

class A {}; 

int main() 
{ 
    using namespace Project::System; 
    A a; 
} 

test.cpp:25:5: error: reference to 'A' is ambiguous 
    A a; 
    ^
test.cpp:20:7: note: candidate found by name lookup is 'A' 
class A {}; 
    ^
test.cpp:9:20: note: candidate found by name lookup is 'Project::System::A' 
    using Utility::A; 
       ^
1 error generated. 
+0

這也發生在例如爲''使用命名空間std'並在全局範圍內定義一個叫'cout'的東西。即它與OP的問題沒有直接關係。但值得注意的是(作爲一個普遍問題),所以我提高了。 – 2011-03-06 18:05:15

+0

不同之處在於,已知cout是在名稱空間std中定義的。 A是不知名的,在命名空間Project :: System中定義。客戶意外得到了Project :: System :: A(除非另有證明)。 – 2011-03-07 13:18:48

1

它不那麼糟糕,如果沒有別的。

另一方面,我認爲在使用它們時拼出全名是「雜亂」的。對我來說,這只是增加了代碼的清晰度。

+0

從用戶的角度來看,是的,但從庫的角度來看,它不再允許我整齊地對齊函數簽名,使它看起來有點雜亂。 – Dave 2011-03-06 17:50:11

0

命名空間可以被用作其他任何東西。如果你的代碼由於命名空間而變得混亂,這很好地表明你可能過度使用它們。

如果您使用命名空間來分隔獨立的域,您不應該經常顯式指定它們。

相關問題