Ошибка класса шаблона C ++ с оператором == - PullRequest
5 голосов
/ 07 апреля 2009

Ошибка:
ошибка C2678: двоичный файл «==»: не найден оператор, который принимает левый операнд типа «const entry» (или нет допустимого преобразования)

Функция:

template <class T, int maxSize>
int indexList<T, maxSize>::search(const T& target) const
{
    for (int i = 0; i < maxSize; i++)  
        if (elements[i] == target)   //ERROR???
            return i;       // target found at position i

    // target not found
    return -1;
}

indexList.h
indexList.cpp

Предполагается, что это перегруженный оператор? Будучи шаблоном класса, я не уверен, что понимаю ошибку?

решение- Функция перегрузки в классе теперь объявлена ​​как const:

//Operators
bool entry::operator == (const entry& dE)  const <--
{
    return (name ==dE.name);

}

Ответы [ 6 ]

9 голосов
/ 07 апреля 2009

Начните с чтения текста ошибки точно таким, какой он есть:

binary '==': не найден оператор, который принимает левый операнд типа 'const entry'

Это означает, что он не может найти ни одного оператора ==, который принимает тип entry в качестве левого операнда. Этот код недействителен:

entry const e;
if (e == foo)

Вы показали нам код для своего класса списка, но это не та ошибка, о которой идет речь. Ошибка связана с отсутствием операторов для типа entry, что бы это ни было. Либо дайте классу функцию operator==, либо объявите отдельную функцию operator==, которая принимает const entry& в качестве первого параметра.

struct entry {
  bool operator==(const entry& other) const;
};
// or
bool operator==(const entry& lhs, const entry& rhs);

Я думаю, что последний является предпочтительным стилем.

6 голосов
/ 07 апреля 2009

Проблема относится к типу T, который используется в этом случае, без определения оператора ==. Из вашего вопроса я бы догадался, что это класс 'entry'.

Возможно также, что в классе 'entry' не определен правильно оператор == для получения записи const & как параметра.

2 голосов
/ 07 апреля 2009

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

В объявленной функции const указатель this считается const, что означает, что все члены, которые вы используете через этот указатель, также считаются const. Если ваш operator == () для любого типа T, на котором вы специализируетесь, явно не указывает const параметров, вы получите эту ошибку.

Если вы не можете гарантировать, что все используемые вами Ts будут иметь правильные вызовы operator == (), я бы удалил спецификаторы const в шаблонах функций-членов.

1 голос
/ 07 апреля 2009

Оператор равенства для пользовательских типов не определен по умолчанию. Это не имеет ничего общего с вашим шаблоном класса, а скорее с struct или class «записью».

Поэтому вам придется переопределить оператор равенства в struct entry или class entry.

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

1 голос
/ 07 апреля 2009

Тип T, который вы используете в качестве параметра для этого класса, должен иметь operator==(), поскольку код, который вы даете, не содержит экземпляров шаблона, трудно понять, в чем дело.

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

0 голосов
/ 07 апреля 2009

Иногда вполне достаточно написать

...
    if (target == elements[i])
...
...