2009-10-07 3 views
2

При компиляции моего кода с компилятором GNU C++ я получаю что-то вродеЧто означает сообщение об ошибке C++ «<near match>»?

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> показывают и как исправить эту ошибку?

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

+0

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

+0

Я не поместил строку кода, вызывающую ошибку здесь по двум причинам: 1) Само по себе это не помогает (выглядит как getFeature (te, a) :) 2) Я не могу добавить фрагмент, потому что строка в вопрос является частью очень сложной программной среды, из-за которой очень сложно извлечь ее из нее, не изменяя общий bevahiour. – fuenfundachtzig

+0

Ни одна из причин не является веской. –

ответ

12

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

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

EDIT:

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

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

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

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

+0

Я также попытался добавить две строки, но это не помогло. Два последних аргумента (строки) являются необязательными. – fuenfundachtzig

+0

Тогда у вас есть объект const и пытается вызвать метод non-const. –

+0

Да, это оказалось решением. Мне пришлось делать const_cast. – fuenfundachtzig

0

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

4

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

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

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

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

Смежные вопросы