C++ C++;超级方法调用中的名称冲突
假设我有以下代码:C++ C++;超级方法调用中的名称冲突,c++,methods,namespaces,C++,Methods,Namespaces,假设我有以下代码: namespace x{ class X{ virtual void x(){} } } namespace y{ class Y : public x::X{ void x(){} } } int main(){ x::X* a = new y::Y(); a->x::X::x(); //Tries to access x::X::x non-virtually.
namespace x{
class X{
virtual void x(){}
}
}
namespace y{
class Y : public x::X{
void x(){}
}
}
int main(){
x::X* a = new y::Y();
a->x::X::x(); //Tries to access x::X::x non-virtually.
//Fails, since it treats the first x as the
//function name instead of the namespace
}
如您所见,main方法的最后一行尝试静态(即非虚拟)调用类x::x的x方法。但是,这失败了,因为名称空间与方法具有相同的名称(两者都命名为x)。因此,编译器将第一个x作为方法名,然后抱怨x::x没有意义
乍一看,这个问题似乎是假设的,但它确实出现在我们的代码中:名称空间不能那么容易重命名,因为它是一个大型项目的名称空间。无法更改方法名称,因为它必须附着到超出我们范围的其他超类(库类)
那么,是否有机会以某种方式消除这种语法的歧义,以便我仍然能够非虚拟地调用方法x::x::x
现在,我看到的唯一解决方案是typedefing x::x,然后使用typedef。有没有不带typedef的解决方案
a->x::X::x(); //Tries to access x::X::x non-virtually.
//Fails, since it treats the first x as the
//function name instead of the namespace
这实际上是对问题的一个非常清楚的描述。解决方案是删除限定的x::
部分。查找将在Y
中开始,并且在该上下文中找不到X
,然后它将向上移动层次结构,并在X
类中找到X
作为注入名称
这实际上是对问题的一个非常清楚的描述。解决方案是删除限定的
x::
部分。查找将从Y
开始,在该上下文中找不到X
,然后它将在层次结构中向上移动,并在X
类中找到X
作为注入名。我认为它与typedef没有太大区别,但仍然
using namespace xAlias = x;
我不认为它与typedef有什么不同,但仍然
using namespace xAlias = x;
这行得通吗:
a->::x::x::x()
?是的,这行得通,很酷。但这是标准还是依赖于实现?@gexicide:这是标准,将在全局名称空间中查找限定以:
开头的名称。它应该适用于任何地方。。。但@David的解决方案似乎更合适。前缀::
类似于为名称解析指定绝对路径。这是否有效:a->:::x::x::x()
?是的,这在gcc上有效,很酷。但这是标准还是依赖于实现?@gexicide:这是标准,将在全局名称空间中查找限定以:
开头的名称。它应该适用于任何地方。。。但@David的解决方案似乎更合适。前缀:
类似于为名称解析指定绝对路径。