С++ Почему вызов неоднозначен?
class myClass {
int arr[100];
public:
void *get(long i, void* const to) const;
void *get(long i, bool nog);
void *tstfn(void* const to) { return get(0L,to); }
};
gcc -Wall говорит:
dt.cpp: In member function ‘void* myClass::tstfn(void*)’:
dt.cpp:6:49: warning: ISO C++ says that these are ambiguous, even though the worst conversion for the first is better than the worst conversion for the second: [enabled by default]
dt.cpp:4:9: note: candidate 1: void* myClass::get(long int, void*) const
dt.cpp:5:9: note: candidate 2: void* myClass::get(long int, bool)
Ответы
Ответ 1
Оба вызова функций требуют преобразования типов:
- вызов функции
void*
требует добавления атрибута const
к this
- вызов функции
bool
требует преобразования to
с void*
в bool
.
Таким образом, по правилам разрешения перегрузки ни один из них не является "лучшим", чем другой, и вызов считается неоднозначным.
Возможно, вы можете добавить const
ко второй функции; возможно, вы можете удалить его с первого (хотя я бы предпочел не делать этого); возможно, вы можете сделать явное преобразование типов либо this
, либо to
, чтобы принудительно применить ваше предпочтительное переопределение.
Ответ 2
Потому что void *get(long i, void* const to)
- const
.
Это означает, что вызов его из tstfn
(который не является константой) потребует преобразования квалификации для this
от myClass*
до const myClass*
, поэтому для вызова обеих функций потребуется преобразование для аргументов (this
обрабатывается так же, как и другие аргументы), поэтому вызов неоднозначен.
Ответ 3
Просто потому, что вы testfn
являются неконстантной функцией, которая вызовет неконстантную версию get
. Неконстантная функция get
принимает bool
not const void*
. Если бы была только одна функция get
(возможно, принятие void*
в качестве второго аргумента, независимо от ее константы) будет вызвано.