什么是C++中的“命名空间别名”?它是如何使用的?在C++中,什么是“命名空间别名”?
126
A
回答
149
命名空间别名是一种通过不同的较短名称引用长名称空间名称的便捷方式。
作为一个例子,假设您想使用Boost的uBLAS中的数字向量而没有using namespace
指令。说明完整的命名空间每次都是麻烦的:
boost::numeric::ublas::vector<double> v;
相反,你可以定义一个别名boost::numeric::ublas
- 说我们要缩写这只是ublas
:很简单
namespace ublas = boost::numeric::ublas;
ublas::vector<double> v;
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
它是所有关于选择的别名为looong命名空间的名称,如:
namespace SHORT = NamespaceFirst::NameSpaceNested::Meow
后来的后来,你可以的typedef
typedef SHORT::mytype
而不是
typedef NamespaceFirst::NameSpaceNested::Meow::mytype
这句法仅适用于命名空间,不能包括类,类型namespace NAME =
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;
}
}
上述的有用性可能会受到限制,但它应该达到目的。
(对于上面我可能错过的任何错误,我很抱歉。)
相关问题
- 1. C++中的命名空间别名
- 2. C++中的名称空间别名的作用域是什么?
- 3. 什么是aerospike中的命名空间
- 4. 别名冲突命名空间c#
- 5. C++命名空间....匿名命名空间是合法的?
- 6. 在C#中使用名称空间别名有什么好处?
- 7. Rake命名空间别名
- 8. ExtJs命名空间别名
- 9. 命名空间点命名空间和嵌套命名空间有什么区别?
- 10. 在C++中可以重命名/别名非命名空间,非类名?
- 11. IMvcServiceLocator的命名空间是什么?
- 12. testng.xml的命名空间是什么?
- 13. 什么是groovyx命名空间?
- 14. 什么是OpenCV HighGUI命名空间?
- 15. 什么是DomDocument命名空间?
- 16. 什么是MapRoute命名空间参数?
- 17. DispatcherTimer类的命名空间是什么?
- 18. 什么是ksoap命名空间?
- 19. 什么是命名空间,XPath轴
- 20. 什么是“kube-system”命名空间?
- 21. 命名空间是什么?用法呢?
- 22. 什么是CreateIfNotExists的命名空间?
- 23. NUnit CollectionAssert的命名空间是什么?
- 24. 什么是VJSharp命名空间?
- 25. F#中的命名空间别名?
- 26. Oxygene中的命名空间别名
- 27. XAML命名空间的最佳命名约定是什么?
- 28. Doctrine2中的实体名称空间和别名是什么?
- 29. 什么是C++中使用的命名空间?
- 30. 是否有可能颠倒c#命名空间的别名?
为了可能解释downvotes,SO不是和永远不会成为一个好的C++教科书的替代品。您提出的问题将由任何此类书籍回答。回答你自己的问题的SO“特征”不应该被用来提供这些书的解释。 – 2009-07-31 09:02:19
没有采取任何行动...只是为了解释我为什么这样做:这是我从播客中的Joel的评论中了解到,即使是“入门级”的问题也是对SO的公平游戏,并且提出问题和答案是可以接受的如果那些内容不是以可访问的形式存在,那么你自己呢。但显然,这是皱眉? – 2009-07-31 09:17:06