我希望能够在类声明中使用命名空间别名,但会出现编译器语法错误。
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);
}
};
}
要切换到另一个库,这是我的别名命名空间引用的,我只需更改别名。这种方法甚至允许我在一个文件中有两次相同的类,每次都引用一个不同的库。 谢谢你的帮助。
答案 0 :(得分:32)
类定义中的命名空间别名为非法,由语言规范指定。
允许在中仅在命名空间范围或功能范围内。
您可以在命名空间范围内创建别名。但这将成为永久别名,也可以从其他文件中使用。但解决方案很简单:您可以使用未命名的命名空间来防止别名(因此来自大命名空间的所有符号)从其他文件中可见。这是如何做到的:
//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上不能有多个文件)
答案 1 :(得分:1)
命名空间别名的范围是代码块。
所以你可以把它放在任何代码块中。
但是,你不能把它放在课堂里,因为这意味着它是班上的一员 命名空间别名不能是成员。
有关命名空间别名的更多信息:
答案 2 :(得分:0)
如果在结构外部声明别名,则它可以正常工作。
答案 3 :(得分:0)
您当然也可以将别名放在类别之外:
namespace abc = a_big_namespace;
struct MyClass {
void fn()
{ abc::test(); }
};