c ++: нет соответствующей функции для вызова, но кандидат имеет точно такую ​​же подпись - PullRequest
1 голос
/ 31 августа 2011

г ++ жалуется на

myclass.cxx:185: error: no matching function for call to 'IMyInterface::doSomething(const SomeClass*, unsigned int)'
IMyInterface.h:34: note: candidates are: virtual void IMyInterface::doSomething(const SomeClass*&, unsigned int)

когда я звоню

m_instanceOfInterface->doSomething((const SomeClass*)0,(unsigned int)1);

Есть какие-нибудь указатели на почему? Мне кажется, что g ++ видит точно такую ​​же сигнатуру между тем, что объявлено, и тем, что вызывается, но все же жалуется на то, что не найдена соответствующая функция.

В этом же контексте я могу вызвать другую функцию IMyInteface, IMyInterface::doSomethingElse(float& p). Так почему-то const это проблема?


Я не передавал указатель NULL и не приводил константное целое число просто для забавы ... изначально у меня есть

m_instanceOfInterface->doSomething((const SomeClass*)m_someDerivedClass,m_anInteger);

и получил ту же ошибку. Поэтому я решил прояснить ситуацию с g ++, приведя некоторые явные аргументы. Я могу заверить вас, что указатель NULL НЕ является проблемой - хотя по понятным причинам мы все немного сжались, увидев, что NULL передается с const:)

Ответы [ 3 ]

5 голосов
/ 31 августа 2011

Функция требует аргумента по неконстантной ссылке, которая не может быть привязана к временной. Обратите внимание:

void foo(int, T &);
foo(1, T()); // error, cannot bind to temporary

В вашем случае T = SomeClass const *. Итак, вы предоставили невременный:

SomeClass const * pc = 0;
m_instanceOfInterface->doSomething(pc, 1U);

Обратите внимание, что цель этого предположительно состоит в том, чтобы заполнить pc некоторым значащим значением, поэтому обязательно включите его соответствующим образом.

3 голосов
/ 31 августа 2011

Редактировать
Исправлено с учетом комментариев.

Кандидат не имеет точно такую ​​же подпись. Функция получает ссылку на константный указатель на SomeClass, и вы предоставляете указатель. На самом деле вы предоставляете особенно неприятный указатель на функцию.

Одна большая проблема здесь - нулевой указатель. Вам нужно дать компилятору что-то солидное, чтобы оно могло ссылаться на него. Вы даете ему нулевой указатель.

2 голосов
/ 31 августа 2011

Ваша функция требует неконстантной ссылки на указатель, а не указатель. Вы не можете создать неконстантную ссылку из литерала (то есть нулевого указателя), поэтому компилятор не может вызвать функцию с первым аргументом '0', и он ищет перегрузку, принимающую свой первый аргумент (указатель) ) копией.

...