С++ Почему вызов неоднозначен?

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* в качестве второго аргумента, независимо от ее константы) будет вызвано.