Что означает сообщение об ошибке 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 ответа:
Обычно я вижу
<near match>
, когда возможный метод совпадает, за исключениемconst
. Может быть, строки являются необязательными аргументами в этом случае? В этом случае проблема заключается в том, что у вас есть объект const, и вы пытаетесь вызвать неконстантный метод.NB: я никогда не смотрел на код компилятора, просто смотрел на сообщения об ошибках, которые генерирует gcc.
Правка:
Из вашего комментария следует, что строки в конце необязательны, так что проблема не в этом. Предполагая, что это метод, который вы хотите вызвать, тогда проблема заключается в том, что у вас есть const указатель/ссылка на объект, и вы пытаетесь вызвать неконстантный метод. Чтобы исправить это, либо:
- сделайте метод
const
, если он не изменяет видимое состояние объекта- или передать неконстантную ссылку / указатель
Если ни один из этих вариантов вообще не возможен, и в крайнем случае вы не можете изменить ни одну из этих вещей, вы можете
const_cast
указатель / ссылка, но тогда вы оставляете очень плохой запах в коде.У нас есть несколько мест, которые делают
const_cast
s в нашем коде, но только при вызове старых функций C, которые берут неконстантный указатель, но не изменяют его. В прямом коде C++, которым вы управляете, вы можете избежатьconst_cast
.
Это часть процесса разрешения перегрузки.
Компилятор перечисляет все перегрузки, которые были рассмотрены в этом разрешении перегрузки, так что вы можете проверить, что тот, который вы действительно хотели вызвать, действительно присутствует (если нет, вы пропустили включение заголовка, квалификацию и т. д...)Другими словами, это указывает на то, что среди всех рассмотренных перегрузок вы, вероятно, хотели вызвать это и должны проверить, что ваши аргументы действительно соответствуют сигнатуре.
<near match>
указывает, что это (согласно компилятору) возможная перегрузка, которую вы действительно хотели вызвать, так как это лучшая перегрузка согласно критериям (const-ness, possible преобразования, ...)
Это означает, скорее всего, что существует несоответствие между типами в вызывающем узле и в объявлении функции. В частности, это означает, что у вас, вероятно, есть один "const" слишком много или слишком мало с одной или другой стороны. Сообщение об ошибке дало вам номера строк несоответствующего объявления / вызова.