Что означает сообщение об ошибке C ++ «<ближний матч>»? - PullRequest
3 голосов
/ 07 октября 2009

При компиляции моего кода с помощью компилятора GNU C ++ я получаю что-то вроде

bla.cxx: In function `int main(int, const char**)':
bla.cxx:110: error: no matching function for call to `func(const classA*&, const classB<classC>*&) const'
someheader.h:321: note: candidates are: bool func(const classA*, const T*&, const std::string&, std::string&) [with T = classB<classC>] <near match>

Что означает <near match> и как я могу исправить эту ошибку?

(Я максимально упростил сообщение об ошибке без (надеюсь) удаления необходимой информации. На самом деле, я бы не стал приводить здесь явный пример, но рекомендую общие ответы на вопрос!)

Ответы [ 3 ]

14 голосов
/ 07 октября 2009

Обычно я вижу <near match>, когда возможный метод соответствует, кроме const. Может быть, строки являются необязательными аргументами в этом случае? В этом случае проблема в том, что у вас есть const-объект, и вы пытаетесь вызвать неконстантный метод.

Примечание: я никогда не смотрел на код компилятора, просто смотрел на сообщения об ошибках, сгенерированные gcc.

EDIT:

Из вашего комментария строки в конце являются необязательными, поэтому проблема не в этом. Предполагая, что это метод, который вы хотите вызвать, проблема в том, что у вас есть константный указатель / ссылка на объект, и вы пытаетесь вызвать неконстантный метод. Чтобы это исправить, либо:

  • Сделать метод const, если он не изменяет видимое состояние объекта
  • Или передать неконстантную ссылку / указатель

Если ни один из этих вариантов вообще невозможен, и в качестве крайней меры, и вы не можете изменить ни одну из этих вещей, вы можете const_cast указатель / ссылку, но тогда вы оставите в коде очень неприятный запах .

У нас есть несколько мест, которые делают const_cast в нашем коде, но только при вызове старых функций C, которые принимают неконстантный указатель, но не изменяют его. В прямом коде C ++, которым вы управляете, вы можете избежать const_cast.

4 голосов
/ 07 октября 2009

Это часть процесса разрешения перегрузки.

Компилятор перечисляет все перегрузки, которые рассматривались в этом разрешении перегрузки, так что вы можете проверить, присутствует ли тот, который вы на самом деле хотели вызвать (если нет, вы пропустили включение заголовка, квалификацию и т. Д ...)

<near match> указывает, что это (согласно компилятору) возможная перегрузка, которую вы на самом деле хотели вызвать, так как это лучшая перегрузка в соответствии с критериями (постоянство, возможные преобразования, ...)

Другими словами, это признак того, что среди всех рассмотренных перегрузок вы, вероятно, хотели бы вызвать это и должны проверить, что ваши аргументы действительно соответствуют сигнатуре.

0 голосов
/ 07 октября 2009

Это, скорее всего, означает, что существует несоответствие между типами на вызывающем сайте и в объявлении функции. В частности, это означает, что у вас, вероятно, есть один «констант», слишком много или слишком мало на одной или другой стороне. Сообщение об ошибке дало вам номера строк несоответствующей декларации / вызова.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...