Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.79/29: Рейтинг темы: голосов - 29, средняя оценка - 4.79
1 / 1 / 0
Регистрация: 03.05.2018
Сообщений: 101
1

Binary '==' no operator found which takes a left-hand operand of type 'T'

12.11.2018, 20:26. Показов 5541. Ответов 11
Метки нет (Все метки)

Здравствуйте. Пытаюсь сравнить элемент массива с объектом,который я создаю в мейн и компилятор ругается "Severity Code Description Project File Line Suppression State
Error C2678 binary '==': no operator found which takes a left-hand operand of type 'T' (or there is no acceptable conversion). Я понимаю, что может из-за перегрузки, но как тут перегрузить его? Я надеюсь, что здесь есть люди, которые хоть немного шарят
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
template <typename T>
class List
{
public:
    List() {    
        size = capacity = 0;
        T* arr = new T[capacity];
    }
 
bool Contains(T* obj) {
        for (int i = 0; i < size; i++)  // Здесь проблема 
            if (arr[i] == obj) return true;
 
    }
private:
    T*arr;
    int size;
    int capacity;
};
 
int main()
{
    Dog* dog=new Dog();
    List <Dog> list;
    list.Contains(new Dog("Doog"));
}
Заранее спасибо
0

Помощь в написании контрольных, курсовых и дипломных работ здесь.

Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
12.11.2018, 20:26
Ответы с готовыми решениями:

Ошибка "binary '==': no operator found which takes a left-hand operand of type"
while (currentNode != endNode) { nextNode = path; nextNode1 = path; takeRoute.x =...

Ошибка binary '=' : no operator found which takes a right-hand operand of type
Ошибка Erro1 error C2679: binary '=' : no operator found which takes a right-hand operand of type...

Error C2679: binary '>>': no operator found which takes a right-hand operand of type
нужно написать программу обработки структур. в программе использовать структуру, содержащую поля с...

Ошибка: error C2679: binary '<<' : no operator found which takes a right-hand operand of type
Нужно создать класс List для представления простого списка. Подскажите, почему появляется такая...

11
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
12.11.2018, 20:40 2
Смотри, в массиве ты хранишь собак, а в функцию ты передаёшь указатель на собаку.
Так будет работать:
C++
1
2
3
4
5
6
bool Contains(const T& obj)
 
....
 
Dog d = Dog("Doog");
list.Contains(d);
Добавлено через 1 минуту
Ещё ошибка тут
C++
1
T* arr = new T[capacity];
Надо arr = new T[capacity];

И да, удаляй за собой память.
1
1 / 1 / 0
Регистрация: 03.05.2018
Сообщений: 101
12.11.2018, 22:10  [ТС] 3
К сожаление, это не помогло, все та же ошибка(((. Может, нужно перегрузить оператор ==?
0
303 / 215 / 74
Регистрация: 23.05.2011
Сообщений: 971
13.11.2018, 01:08 4
steptrainee, естественно.
0
1 / 1 / 0
Регистрация: 03.05.2018
Сообщений: 101
13.11.2018, 21:28  [ТС] 5
Вы знаете как исправить данную проблему ?
0
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,080
Записей в блоге: 1
13.11.2018, 21:45 6
C++
1
2
3
4
bool operator ==(const Dog& left, const Dog& right)
{
    return left.name == right.name &&left.age == right.age;
}
0
1 / 1 / 0
Регистрация: 03.05.2018
Сообщений: 101
14.11.2018, 18:22  [ТС] 7
Такая перегрузка не работает. Сравнивается тип List<T> с объектом, который приходит с мейна
bool Contains(T* obj)
if (arr[i] == obj) ...
А вы написали перегрузку для конкретных собак, это же шаблонный класс, откуда вы знаете что передаст пользователь? Есть вариант сравнить их через библиотечную функцию std::equal , но мы еще не учили, я пытаюсь найти решение более приземленное.
0
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
14.11.2018, 18:33 8
steptrainee, а вы думаете std::equal без == работает?

Добавлено через 1 минуту
Цитата Сообщение от steptrainee Посмотреть сообщение
откуда вы знаете что передаст пользователь?
Программе уже известно, что объект класса List принимает только собак

Добавлено через 1 минуту
Разыменование кто делать будет?!
C++
12
if (arr[i] == *obj) return true;
1
3413 / 2772 / 751
Регистрация: 25.03.2012
Сообщений: 10,080
Записей в блоге: 1
14.11.2018, 18:35 9
steptrainee, и что с того? Ты хочешь в один лист намешать и собак и ещё кого-то? Так не бывает, какой же это тогда лист?
А если просто создавать различные списки для собак и для кошек, то в чём тогда проблема перегрузить для каждого класса свой оператор ==?
0
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
14.11.2018, 18:42 10
Лучший ответ Сообщение было отмечено steptrainee как решение

Решение

Исправил
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
#include <string>
 
class Dog
{
    std::string m_Name;
public:
    Dog() {}
    Dog(std::string _name) : m_Name{_name} {}
    friend bool operator==(const Dog &lhs, const Dog &rhs)
    {
        return (lhs.m_Name == rhs.m_Name);
    }
};
 
template <typename T>
class List
{
public:
    List() {
        size = capacity = 0;
        arr = new T[capacity];
    }
    bool Contains(const T &obj) {
        for (int i = 0; i < size; i++)  // Здесь проблема
            if (arr[i] == obj) return true;
        return false;
    }
    ~List() { delete[] arr; }
private:
    T* arr;
    int size;
    int capacity;
};
 
int main()
{
    List<Dog> list{};
    list.Contains(Dog{"Dog"});
}
1
1 / 1 / 0
Регистрация: 03.05.2018
Сообщений: 101
14.11.2018, 19:38  [ТС] 11
Спасибо, у вас лучший ответ, все грамотно и конкретно, что я и искал, действительно работает. Я однажды пробовал дружественно перегрузить, но ничего не заработало и я сдался.
0
278 / 250 / 209
Регистрация: 14.11.2016
Сообщений: 948
14.11.2018, 19:58 12
steptrainee, не только в этом ошибка.
C++
7
T* arr = new T[capacity]; // зачем T*, если arr уже объявлен в private?
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.11.2018, 19:58

no operator found which takes a right/left-hand operand of type "AR"
Нашел на форуме исходник программы, собрал, но выдает ошибку описанную выше #include &lt;iostream&gt;...

Исправить ошибку "error C2679: binary '*' : no operator found which takes a right-hand operand of type"
matiza.h #pragma once template &lt;typename N&gt; class matriza { protected: int stroka; N...

No operator found which takes a right-hand operand
Кто подскажет в чем ошибка? #include &lt;iostream&gt; #include &lt;vector&gt; class LongNumber {...

Ошибка: "binary '=' no operator found which takes a right-hand operand"
Добрый день. Пытаюсь функцией вернуть массив byte. Пишу так: STDMETHODIMP...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2021, vBulletin Solutions, Inc.