我希望能够在类声明中使用命名空间别名,但出现编译器语法错误。
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);
}
};
}
要切换到另一个库,这是我的别名命名空间所指的,我只需更改别名。这种方法甚至允许我在一个文件中两次拥有相同的类,每次都引用不同的库。 感谢您的所有帮助。
最佳答案
类定义中的命名空间别名是非法,由语言规范指定。
其允许仅在命名空间范围或函数范围内。
您可以在命名空间范围内创建别名。但这将成为永久别名,也可以从其他文件中使用。但解决方案很简单:您可以使用 unnamed 命名空间来防止别名(以及大命名空间中的所有符号)在其他文件中可见。可以这样做:
//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' has not been declared
这证明了别名 abc
在 MyFile.cpp
中only 可见。感谢 unnamed 命名空间。
演示:http://www.ideone.com/2zyNI (虽然它没有展示 OtherFile 的概念。我在 ideone.com 上不能拥有多个文件)
关于整个类范围内的 C++ 命名空间别名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6056047/