Что означает сообщение об ошибке C++" "?


При компиляции моего кода с помощью компилятора 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 3

3 ответа:

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

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

Правка:

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

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

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

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

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

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

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

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

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