C++ C++;整个类作用域中的命名空间别名
我希望能够在类声明中使用名称空间别名,但遇到编译器语法错误C++ C++;整个类作用域中的命名空间别名,c++,namespaces,scope,alias,C++,Namespaces,Scope,Alias,我希望能够在类声明中使用名称空间别名,但遇到编译器语法错误 struct MyClass { namespace abc = a_big_namespace; void fn() { abc::test(); } }; 我能让它工作的唯一方法是在每个函数中使用别名 void fn() { namespace abc = a_big_namespace; abc::test(); } 此外,我希望能够将别名用于函数参数。我还没有找到解决这
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);
}
};
}
要切换到别名名称空间所指的另一个库,我只需更改别名。这个方法甚至允许我在一个文件中有两次相同的类,每次引用不同的库。
感谢您的帮助。如果您将别名声明在结构之外,它会起作用。当然,您也可以将别名放置在类之外:
namespace abc = a_big_namespace;
struct MyClass {
void fn()
{ abc::test(); }
};
根据语言规范的规定,类定义中的命名空间别名是非法的 它的仅允许在命名空间范围或函数范围中使用
您可以在命名空间范围内创建别名。但这将是一个永久的别名,也可以从其他文件中使用。但解决方案很简单:您可以使用未命名的名称空间来防止别名(以及大名称空间中的所有符号)在其他文件中可见。这是如何做到的:
//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
中可见。感谢未命名的名称空间
演示:(虽然它没有演示其他文件的概念。我在ideone.com上不能有多个文件)命名空间别名的作用域是一个代码块 所以你可以把它放在任何代码块中 但是,您不能将它放在类中,因为这意味着它是该类的成员。
命名空间别名不能是成员 有关命名空间别名的详细信息:
非常感谢Nawaz,我没有意识到类作用域中的别名是非法的,我也不知道解决方法。我遇到了匿名名称空间,所以我将完全按照您的建议实现我的代码。再次感谢。这里描述的解决方案需要注意:虽然这些别名在不同的cpp文件中确实不可见,但在其他头文件中也可见。因此,例如,如果在一个头文件中应用此变通方法,则项目中的每个其他头文件都可以使用相同的别名,而不考虑周围的名称空间。您将无法将同一别名分配给项目中任何其他头文件中的不同命名空间,并且只能在单个头文件中定义一个给定别名一次。Visual Studio 2013也是如此,在其他平台上可能不一样。“可以在命名空间范围内生成别名。但这将生成永久别名,也可以从其他文件中使用。”-能否提供跨编译单元可见命名空间别名的参考?我不确定这是否有帮助。cpp文件中的Namspace别名在其他任何地方都看不到。匿名名称空间AFAIK用于避免导出/冲突具有静态链接的函数或数据的符号。我的要求是名称空间仅限于类,因为我使用相同的别名引用两个不同的库,具体取决于我使用的类。是的,它可以工作,但不符合我的要求。谢谢你的想法。谢谢空间,请看我对博的回复。很抱歉,你的回答不令人满意。类和名称空间非常相似。然而,我们可以有内部类。我们甚至可以有内部typedef和基本方法的内部用法。甚至内部静态断言!因此,没有任何内部名称空间听起来像是comitee IMHO做出的完全武断的判断。