C++整个类作用域中的命名空间别名
C++ namespace alias in entire class scope
我希望能够在类声明中使用命名空间别名,但得到编译器语法错误。
struct MyClass
{
namespace abc = a_big_namespace;
void fn() {
abc::test();
}
};
我能让它工作的唯一方法是将别名放在每个函数中。
void fn() {
namespace abc = a_big_namespace;
abc::test();
}
此外,我希望能够将别名用于函数参数。 我还没有找到解决方法。
void fn(abc::testType tt) {
abc::test(tt);
}
有没有办法做我想做的事?
编辑:我的解决方案
我发现我的特定问题不需要未命名的命名空间,可以简单地这样做:
namespace myspace
{
namespace abc = a_big_namespace;
struct MyClass
{
void fn(abc::testType tt) {
abc::test(tt);
}
};
}
要切换到另一个库,这是我的别名命名空间所指的,我只需更改别名。这种方法甚至允许我在单个文件中两次使用相同的类,每次引用不同的库。感谢您的帮助。
类
定义中的命名空间别名是非法的,由语言规范指定。
它只允许在命名空间范围或函数范围内。
可以在命名空间范围创建别名。但这将创建一个永久别名,也可以从其他文件使用。但是,解决方案很简单:您可以使用未命名的命名空间来防止别名(以及大命名空间中的所有符号)从其他文件中可见。这是可以做到的:
//MyFile.cpp
namespace myspace
{
namespace //this is unnamed namespace
{
namespace abc = a_big_namespace;
}
struct MyClass
{
void fn()
{
abc::test(); //don't worry, this will work!
}
};
}
//OtherFile.cpp
myspace::abc::test(); //error - that means, prevention worked.
别名在其他文件中不可见。在编译OtherFile.cpp
时,GCC(4.5.0)说:
"myspace::ABC"尚未声明
这证明别名abc
仅在MyFile.cpp
中可见。感谢未命名的命名空间。
演示:http://www.ideone.com/2zyNI(尽管它没有演示 OtherFile 概念,因为我 ideone.com 不能有多个文件)
命名空间
别名的作用域是代码块。
因此,您可以将其放在任何代码块中。
但是,你不能把它放在一个类中,因为这意味着它是类的成员。
命名空间别名不能是成员。
有关命名空间别名的更多信息:
C++命名空间别名的作用域是什么?
命名空间
如果在结构外部声明别名,它就可以工作。
当然,您也可以将别名放在类之外:
namespace abc = a_big_namespace;
struct MyClass {
void fn()
{ abc::test(); }
};
相关文章:
- 命名空间中具有.h和.cpp文件的类
- 从父命名空间重载类型
- 在命名空间中定义函数还是限定函数
- C++:对不存在的命名空间使用命名空间指令
- 通过继承类使用来自不同命名空间的运算符
- 使用命名空间时出现多个定义错误
- CUDA内核和数学函数的显式命名空间
- 使用命名空间别名编译 OpenCV
- 命名空间别名是否会更改链接?
- 依赖于参数的查找在来自另一个命名空间的别名类型上意外行为
- 专用模板是命名空间别名实际上是一个别名
- 一个命名空间有多个别名
- 链接器是否识别命名空间别名
- 在C++中,可以重命名/别名为非命名空间、非类名
- 能否在c++中向前声明一个命名空间别名?
- 命名空间别名范围问题
- 与预处理器相比,使用命名空间别名的好处
- C++整个类作用域中的命名空间别名
- 命名空间别名与定义的实际优势
- 在不同的命名空间中调用别名声明的基类构造函数