为什么我不能使用 using 来消除基本成员变量之间的歧义?

Why can't I use using to disambiguate between base members variables?

提问人:TimeHorse 提问时间:2/28/2013 最后编辑:Martijn PietersTimeHorse 更新时间:4/15/2014 访问量:250

问:

在这个简单的类层次结构中,我试图让类 C 通过告诉它“使用 B::x”来消除使用哪个 x 的歧义,但这不会在 G++ 中编译,因为它仍然无法弄清楚我在函数 foo 中指的是哪个 x。我知道使用可以用来推广隐藏方法,但为什么不是变量呢?我考虑过将 X 类作为 A 和 B 的虚拟基础,并定义 X,但这并不是我想要的;我想要的是 A:x 由直接派生的东西使用,除非也派生自 B,有点像 Python 使用其成员(名称)解析顺序算法的方式(最后一个类获胜,所以在这种情况下使用 B:x,请参阅 http://starship.python.net/crew/timehorse/BFS_vs_MRO.html 有关说明。

我对ISO C++ 2011在这方面存在缺陷的评估是否正确?不可能使用“使用”来消除基成员变量的歧义?

class A {
protected:
    int x;
};

class B {
protected:
    int x;
};

class C : public A, public B {
protected:
    using B::x;

public:
    int foo(void) { return x; }
};

编辑:编译器版本:g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3

C++ ISO using-directives 方法-解析-顺序

评论

0赞 jrok 2/28/2013
你可以说.我不会说这是缺陷,它比.:)return B::x;using B::x
0赞 Mike Seymour 2/28/2013
您的代码为我编译:演示。 适用于名称,因此对于函数、变量、类型或其他任何带有名称的内容应该完全相同。还是我误解了这个问题?using
0赞 TimeHorse 2/28/2013
谢谢jrok;但问题是我没有包括完整类层次结构的全部复杂性,因此 A 和 B 具有 C 必须提供的虚函数,并且 x 在派生类中的使用很多,所以这是很多替换。Mike,你用的是哪个版本的编译器?如上所述,它不适用于 g++ 4.6.3;这是我可以访问的最新版本。

答:

0赞 Davidbrcz 4/15/2014 #1

它适用于 C++11 和 g++ 4.8:http://ideone.com/oF4ozq

#include <iostream>
using namespace std;
class A {
protected:
    int x = 5 ;
};

class B {
protected:
    int x = 42 ;
};

class C : public A, public B {
protected:
    using B::x;

public:
    int foo(void) { return x; }
    int fooa(void) { return A::x; }
     int foob(void) { return B::x; }
};
int main() {
    C c;
    std::cout<<c.foo()<<std::endl;
    std::cout<<c.fooa()<<std::endl;
    std::cout<<c.foob()<<std::endl;
    return 0;
}