я получил следующую структуру:C++ проблема разрешения перегрузки
struct A
{
A();
virtual ~A();
virtual void Foo() =0;
};
struct E;
struct F;
struct B: public A
{
B();
virtual ~B();
virtual void Bar(E*) =0;
virtual void Bar(F*) =0;
};
struct C: public B
{
C();
virtual ~C();
void Bar(E*);
};
struct D: public C
{
D();
virtual ~D();
void Foo();
void Bar(F*);
};
struct E: public A
{
E();
virtual ~E();
void Foo();
/* ... */
};
struct F: public A
{
F();
virtual ~F();
void Foo();
/* ... */
};
template <class _Base>
struct G: public _Base
{
G(const _Base &b)
: _Base(b)
{}
virtual ~G()
{}
using _Base::Bar; // doesn't help
/* ... */
};
Когда я пытаюсь вызвать Bar() на объект типа G <D> с Е *, я получаю следующее ошибка времени компиляции:
error: no matching function for call to 'G<D>::Bar(E*&)'
note: candidates are: virtual void D::Bar(F*)
Если я переименовывать заявления (виртуальной) ничтожной Bar (F *), код компилируется нормально и работает, как ожидалось.
Использование:
typedef std::list<E*> EList;
typedef std::list<F*> FList;
EList es;
FList fs;
G<D> player(D());
es.push_back(new E); // times many
fs.push_back(new F); // times many
for(EList::iterator i0(es.begin()), i1(es.end()); i0 != i1; ++i0)
{
player.Bar(*i0);
}
for(FList::iterator i0(fs.begin()), i1(fs.end()); i0 != i1; ++i0)
{
player.Bar(*i0);
}
1, Что случилось с несколькими перегрузками функций-членов, принимающих различные аргументы?
2, Почему компилятор не может сказать разницу между ними?
Оказывается, проблема связана с перегрузкой, а не с динамической диспетчеризацией. Я задал вопрос. Кроме того, вы нашли это: http://stackoverflow.com/questions/72010/c-overload-resolution – zyndor