2009-07-31 93 views

回答

149

命名空間別名是一種通過不同的較短名稱引用長名稱空間名稱的便捷方式。

作爲一個例子,假設您想使用Boost的uBLAS中的數字向量而沒有using namespace指令。說明完整的命名空間每次都是麻煩的:

boost::numeric::ublas::vector<double> v; 

相反,你可以定義一個別名boost::numeric::ublas - 說我們要縮寫這只是ublas:很簡單

namespace ublas = boost::numeric::ublas; 


ublas::vector<double> v; 
+7

爲了可能解釋downvotes,SO不是和永遠不會成爲一個好的C++教科書的替代品。您提出的問題將由任何此類書籍回答。回答你自己的問題的SO「特徵」不應該被用來提供這些書的解釋。 – 2009-07-31 09:02:19

+16

沒有采取任何行動...只是爲了解釋我爲什麼這樣做:這是我從播客中的Joel的評論中瞭解到,即使是「入門級」的問題也是對SO的公平遊戲,並且提出問題和答案是可以接受的如果那些內容不是以可訪問的形式存在,那麼你自己呢。但顯然,這是皺眉? – 2009-07-31 09:17:06

6

,中的#define將無法工作。

namespace Mine { class MyClass { public: int i; }; } 
namespace His = Mine; 
namespace Yours { class Mine: public His::MyClass { void f() { i = 1; } }; } 

編譯好。讓您解決名稱空間/類名衝突問題。

namespace Nope { class Oops { public: int j; }; } 
#define Hmm Nope 
namespace Drat { class Nope: public Hmm::Oops { void f() { j = 1; } }; } 

在最後一行,「Hmm:Oops」是一個編譯錯誤。預處理器將其更改爲Nope :: Oops,但Nope已經是類名。

1

後還要注意,命名空間別名和使用指令是在編譯時解析,無法運行時間。 (更具體地說,它們都是用來告訴編譯器在解析名稱時還有什麼地方需要查看的工具,如果它無法在當前作用域或其任何父作用域中找到特定符號)。例如,這些都不會編譯:

namespace A { 
    int foo; 
    namespace AA { 
     int bar; 
    } // namespace AA 
    namespace AB { 
     int bar; 
    } // namespace AB 
} // namespace A 
namespace B { 
    int foo; 
    namespace BA { 
     int bar; 
    } // namespace BA 
    namespace BB { 
     int bar; 
    } // namespace BB 
} // namespace B 

bool nsChooser1, nsChooser2; 
// ... 

// This doesn't work. 
namespace C = (nsChooser1 ? A : B); 
C::foo = 3; 

// Neither does this. 
// (Nor would it be advisable even if it does work, as compound if-else blocks without braces are easy to inadvertently break.) 
if (nsChooser1) 
    if (nsChooser2) 
     using namespace A::AA; 
    else 
     using namespace A::AB; 
else 
    if (nsChooser2) 
     using namespace B::BA; 
    else 
     using namespace B::BB; 

現在,好奇的心態可能已經注意到,constexpr變量也用於在編譯時,並想知道是否可以在任何一個別名或指令一起使用。據我所知,他們不能,雖然我可能對此有錯。如果您需要在不同命名空間中使用命名相同的變量,並動態選擇它們,則必須使用引用或指針。

// Using the above namespaces... 
int& foo = (nsChooser1 ? A::foo : B::foo); 

int* bar; 
if (nsChooser1) { 
    if (nsChooser2) { 
     bar = &A::AA::bar; 
    } else { 
     bar = &A::AB::bar; 
    } 
} else { 
    if (nsChooser2) { 
     bar = &B::BA::bar; 
    } else { 
     bar = &B::BB::bar; 
    } 
} 

上述的有用性可能會受到限制,但它應該達到目的。

(對於上面我可能錯過的任何錯誤,我很抱歉。)