Не просветит ли кто-нибудь по вопросу function overloading.
Первый пример:
// test1.cpp
struct S {
operator short* ();
operator char* () const;
};
void f (short*);
void f (char*);
void foo (S& s)
{
f (s);
}
g++ -c test1.cpp
test1.cpp: In function 'void foo(S&)':
test1.cpp:11: error: call of overloaded 'f(S&)' is ambiguous
test1.cpp:6: note: candidates are: void f(short int*)
test1.cpp:7: note: void f(char*)
Как я понимаю, логика следующая: S, с помощью user defined conversion, можно превратить в сhar* и в short*. Оба преобразования эквивалентны, следовательно компилятор не может выбрать лучший вариант и выдает ошибку.
Второй пример:
// test2.cpp
struct B {};
struct D : private B {};
void f (B*);
void f (D*);
struct S {
operator B* () const { return 0; }
operator D* () { return 0; }
};
void foo(S & s)
{
f(s);
}
g++ -c test2.cpp
Ошибок нет. Под отладчиком проверил — выбирается f(D*). Отличие от первого примера только в том, что char* и short* можно конвертить друг в друга, а B* и D* нет. Но при чем здесь это?
Спасибо.