0

假设我有以下代码:

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 ?

现在,我看到的唯一解决方案是键入 x::X,然后使用 typedef。有没有没有typedef的解决方案?

4

2 回答 2

5
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

于 2012-08-20T12:15:29.340 回答
0

我不认为它与 typedef 有很大不同,但仍然......

using namespace xAlias = x;
于 2012-08-20T12:26:39.140 回答