2010-03-25 122 views
4

我有一噸我用符號的命名空間,但是我希望覆蓋其中的一個:解決命名空間衝突

external_library.h

namespace LottaStuff 
{ 
class LotsOfClasses {}; 
class OneMoreClass {}; 
}; 

my_file.h

using namespace LottaStuff; 
namespace MyCustomizations 
{ 
class OneMoreClass {}; 
}; 
using MyCustomizations::OneMoreClass; 

my_file.cpp

int main() 
{ 
    OneMoreClass foo; // error: reference to 'OneMoreClass' is ambiguous 
    return 0; 
} 

如何解決'模棱兩可'的錯誤,而不是訴諸'使用命名空間LottaStuff'替換千人個人使用xxx;「聲明?

編輯:另外,說我不能編輯my_file.cpp,只有my_file.h。因此,如下所示,將OneMoreClass替換爲MyCustomizations :: OneMoreClass無處不在。

+2

這裏有一個提示 - 不要使用「using」關鍵字,而應該使用完全限定的名稱來引用類:vector <> - > :: std :: vector <>! – Poni 2010-03-25 19:54:36

+0

C++ 11將具有用於版本控制命名空間(內聯命名空間)的很好功能,它將允許用戶完全實現此目標......然後,您可能需要等待超過您希望的功能在您的編譯器中除非你使用gcc> 4.4)http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2008/n2535.htm – 2010-03-25 23:43:37

+0

另請參見[如何在C++中正確使用名稱空間?]( https://stackoverflow.com/questions/41590/how-do-you-properly-use-namespaces-in-c) – Vadzim 2017-12-20 11:08:57

回答

8

當你說「using namespace」命名空間的全部失去了意義。

所以把它拿出來並使用命名空間。如果你想使用的指令,把它內主:

int main() 
{ 
    using myCustomizations::OneMoreClass; 

    // OneMoreClass unambiguously refers 
    // to the myCustomizations variant 
} 

瞭解什麼using指示做。你有什麼本質上是這樣的:

namespace foo 
{ 
    struct baz{}; 
} 

namespace bar 
{ 
    struct baz{}; 
} 

using namespace foo; // take *everything* in foo and make it usable in this scope 
using bar::baz; // take baz from bar and make it usable in this scope 

int main() 
{ 
    baz x; // no baz in this scope, check global... oh crap! 
} 

一方或另一方會工作,以及將一個範圍內爲main。如果你發現一個命名空間真正乏味的類型,使一個別名:

namespace ez = manthisisacrappilynamednamespace; 

ez::... 

從未使用using namespace在頭部,並在全球範圍內可能永遠不會。在本地範圍內沒問題。

3

應明確指定你想要的OneMoreClass

int main() 
{ 
    myCustomizations::OneMoreClass foo; 
} 
+0

如果我不能編輯my_file.cpp,該怎麼辦?編輯我的問題上面。 – Kyle 2010-03-25 19:48:18

+3

@Kyle:然後停止使用'using namespace'。你不能使用它,然後抱怨命名空間衝突。這就像在你的車上安裝安全帶,但你把它們撕掉,然後抱怨你不安全。 – GManNickG 2010-03-25 19:49:41