Function overloading
От: acoder  
Дата: 19.12.05 13:19
Оценка:
Не просветит ли кто-нибудь по вопросу 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* нет. Но при чем здесь это?

Спасибо.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.