Здравствуйте, acoder, Вы писали:
A>Не просветит ли кто-нибудь по вопросу function overloading.
A>Первый пример:
A>Как я понимаю, логика следующая: S, с помощью user defined conversion, можно превратить в сhar* и в short*. Оба преобразования эквивалентны, следовательно компилятор не может выбрать лучший вариант и выдает ошибку.
Все верно
A>Второй пример:
A>A>// test2.cpp
A>struct B {};
A>struct D : private B {};
A>void f (B*);
A>void f (D*);
A>struct S {
A> operator B* () const { return 0; }
A> operator D* () { return 0; }
A>};
A>void foo(S & s)
A>{
A> f(s);
A>}
A>
A>A>g++ -c test2.cpp
A>
A>Ошибок нет. Под отладчиком проверил — выбирается f(D*). Отличие от первого примера только в том, что char* и short* можно конвертить друг в друга, а B* и D* нет. Но при чем здесь это?
Нет это здесь не причем. Здесь дело в const у оператора приведения типа к B*. Если убрать этот квалификатор, будет точно такай же ambiguous call to overloaded function как и в первом примере.
Дело в том, что объект s у тебя неконстантный и предпочтение отдается неконстантным функциям.
A>Спасибо.