В этой простой иерархии классов я пытаюсь заставить класс C устранить неоднозначность, какой x использовать, говоря ему «используя B :: x», но это не компилируется в G ++, потому что он все еще не может понять, какой 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 ++ 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;
}
Других решений пока нет …