2009-07-31 33 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; 
    } 
} 

上述的有用性可能会受到限制,但它应该达到目的。

(对于上面我可能错过的任何错误,我很抱歉。)