Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/154.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;超级方法调用中的名称冲突_C++_Methods_Namespaces - Fatal编程技术网

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的解决方案似乎更合适。前缀
类似于为名称解析指定绝对路径。