Пожалуйста, рассмотрите следующий код:
struct A
{
void f()
{
}
};
struct B1 : A
{
};
struct B2 : A
{
};
struct C : B1, B2
{
void f() // works
{
B1::f();
}
//using B1::f; // does not work
//using B1::A::f; // does not work as well
};
int main()
{
C c;
c.f();
return 0;
}
Убедительно прошу не копировать стандартный ответ о том, как решить проблему с бриллиантами ("использовать виртуальное наследование"). Я спрашиваю здесь, почему в этом случае не работает декларация использования. Точная ошибка компилятора:
In function 'int main()':
prog.cpp:31:6: error: 'A' is an ambiguous base of 'C'
c.f();
У меня сложилось впечатление, что в этом примере должно работать объявление использования:
struct A
{
void f()
{
}
};
struct B
{
void f()
{
}
};
struct C : A, B
{
using A::f;
};
int main()
{
C c;
c.f(); // will call A::f
return 0;
}
C::f
. - person Jarod42   schedule 04.05.2015using
добавлена в набор перегрузки после поиска неполного имени. В частности, если вы раскомментируете директивуusing
, но удалите явный вызовc.f()
, ваша программа скомпилируется. - person vsoftco   schedule 04.05.2015