Форум программистов, компьютерный форум, киберфорум
C++
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/14: Рейтинг темы: голосов - 14, средняя оценка - 4.57
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 10

Перегрузка оператора сравнения ( no match for 'operator==' )

05.04.2019, 12:53. Показов 2867. Ответов 2

Студворк — интернет-сервис помощи студентам
Приветствую! У меня было задание в институте реализовать класс "Вектор " с соответствующими перегрузками операторов. Все шло по маслу до перегрузки оператора "==".
Первое, что пишет компилятор это: Vekt.cpp:37:30: error: no match for 'operator==' (operand types are 'std::ostream' {aka 'std::basic_ostream<char>'} and 'Vector')
cout << "(A == B) ?: " << P == V;

А потом на несколько страниц пишет примечания (note) типа:
In file included from D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/iosfwd:40,
from D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/ios:38,
from D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/ostream:38,
from D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/iostream:39,
from Vekt.cpp:1:
D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/postypes.h:216:5: note: candidate: 'template<class _StateT> bool std::operator==(const std::fpos<_StateT>&, const std::fpos<_StateT>&)'
operator==(const fpos<_StateT>& __lhs, const fpos<_StateT>& __rhs)
^~~~~~~~
D:/MinGW/mingw64/lib/gcc/x86_64-w64-mingw32/8.1.0/include/c++/bits/postypes.h:216:5: note: template argument deduction/substitution failed:
Vekt.cpp:37:33: note: 'std::ostream' {aka 'std::basic_ostream<char>'} is not derived from 'const std::fpos<_StateT>'
cout << "(A == B) ?: " << P == V;


И повторяет примечания так несколько десятков раз.

Что интересно, так это то, что если вообще убрать перегрузку оператора, то ошибки не пропадут и не изменятся.

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

Буду очень рад, если кто-то сможет помочь

C++ (Qt)
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
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
#include <iostream>
#include <cmath>
using namespace std;
 
class Vector{
    double x,y,z;
public:
 
    Vector(double x=0,double y=0,double z=0);
    void Vset(double x=0,double y=0,double z=0);
    double Len();
    Vector operator+(Vector B);
    Vector operator-(Vector B);
    double operator*(Vector B);//Scalar product
    Vector operator=(Vector B);
    bool   operator==(Vector B);
    friend bool Comp(Vector A, Vector B);
    friend ostream &operator<<(ostream &stream, Vector Object);
    friend istream &operator>>(istream &stream, Vector &Object);
    friend Vector operator*(Vector A, double L);
    friend Vector operator*(double L, Vector A);
};
int main(){
    Vector A(1,2);
    A.Vset(5,2,3);//Setter
    Vector B;
    cin >> B;
    cout << A << endl <<"Length A: " << A.Len() << endl;
    cout << B << endl;
    cout << "Vector A+B: " << A+B << endl;
    cout << "Vector A-B: " << A-B << endl;
    cout << "Vector 2*B: " << 2*B << endl;
    cout << "Vector A*B: " << A*B << endl;
    A = B;
    Vector P(1,2,3),V(4,5,6);
    cout << "(A == B) ?: " << P == V;
 
    return 0;
}
Vector::Vector(double x,double y,double z){
    this->x=x;
    this->y=y;
    this->z=z;
}
double Vector::Len(){
 
    return sqrt(x*x+y*y+z*z);
}
Vector Vector::operator+(Vector B){
    Vector S;
    S.x = x + B.x;
    S.y = y + B.y;
    S.z = z + B.z;
    return S;
}
void Vector::Vset(double x,double y,double z){
    this->x=x;
    this->y=y;
    this->z=z;
}
Vector operator*(Vector A, double l){
    Vector P(A.x*l, A.x*l, A.x*l);
    return P;
}
Vector operator*(double l, Vector A){
    Vector P(A.x*l, A.y*l, A.z*l);
    return P; 
}
double Vector::operator*(Vector B){
 
    return this->x*B.x +this->y*B.y +this->z*B.z;
}
Vector Vector::operator-(Vector B){
    Vector S;
    S.x = x - B.x;
    S.y = y - B.y;
    S.z = z - B.z;
    return S;
}
ostream &operator<<(ostream &stream, Vector Object){
    stream << "Vector(" << Object.x << ", " << Object.y << ", " << Object.z << ")";
    return stream;
}
istream &operator>>(istream &stream, Vector &Object){
    cout << endl << "Enter coordinates of vector." << endl;
    cout << "x=";stream >> Object.x;
    cout << "y=";stream >> Object.y;
    cout << "z=";stream >> Object.z;
    return stream;
}
Vector Vector::operator = (Vector B){
    this->x = B.x;
    this->y = B.y;
    this->z = B.z;
    return *this;
}
bool Vector::operator == (Vector B){
        if (this->x != B.x || this->y != B.y || this->z != B.z) return 0;
        else return 1;
}
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
05.04.2019, 12:53
Ответы с готовыми решениями:

Ошибка при использовании перегруженного оператора вывода в поток: no match for 'operator<<'
Пытаюсь написать класс комплексных чисел, но не могу сделать вот что: #include &lt;iostream&gt; #include &quot;head.h&quot; using...

Перегрузка оператора operator+
для того , чтобы перегрузить унарный оператор + в примере obj1=obj2+10 для обьектов myclass возможно использовать а)френд функцию,...

перегрузка оператора operator< для сортировки
Никак не могу понять почему он не может отсортировать map (строка 123) правильно. operator&lt; на строке 60 #include...

2
 Аватар для eva2326
1673 / 501 / 107
Регистрация: 17.05.2015
Сообщений: 1,518
05.04.2019, 18:56
Лучший ответ Сообщение было отмечено McAndyLarkin как решение

Решение

Цитата Сообщение от McAndyLarkin Посмотреть сообщение
Опираясь на свои знания английского и опыт, могу предположить, что
Все плохо у вас и с английским, и с опытом.

Цитата Сообщение от McAndyLarkin Посмотреть сообщение
cout << "(A == B) ?: " << P == V;
Здесь происходит совсем не то, о чем вы подумали.

У оператора << приоритет выше, чем у ==
Поэтому, сначала компилятор попытается засунуть P в cout
И уже затем сравнить V с тем, что получилось.
Таким образом, сравнение получается: (cout << P) == V;

То бишь, свою V вы пытаетесь сравнивать с cout

V - это Vector
cout - это std::basic_ostream<char>

Но ваш Vector не умеет сравниваться с std::basic_ostream<char>
Отсюда и ошибка:
Code
1
error: no match for ‘operator==’ (operand types are ‘std::ostream {aka std::basic_ostream<char>}’ and ‘Vector’)
Замените:
C++
1
cout << "(A == B) ?: " << P == V;
На:
C++
1
cout << "(A == B) ?: " << (P == V);
1
1 / 1 / 0
Регистрация: 05.04.2019
Сообщений: 10
05.04.2019, 19:03  [ТС]
Спасибо!
Вы абсолютно правы!
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
05.04.2019, 19:03
Помогаю со студенческими работами здесь

Перегрузка оператора сравнения
Перегрузка: bool Zakaz::operator==(Zakaz&amp;B) { if(strcmp(Familia_Zak,B.Familia_Zak)==0 &amp;&amp; Street ==B.Street &amp;&amp; Dom == B.Dom...

Перегрузка оператора сравнения
Есть рабочий код и скрин выполнения чтоб понять суть задачи Rects Rects::operator &lt;(const Rects &amp; obj2) { Rects obj1; ...

Перегрузка оператора сравнения
Посмотрите, пжл, правилен ли синтаксис перегрузки оператора сравнения для двух строк: #include &lt;cstdio&gt; class base { ...

Перегрузка оператора сравнения
Здравствуйте! Объявлен класс Person, у которого имеется поле - age Требуется написать перегрузку оператора сравнения (сравнение...

Перегрузка оператора сравнения
Скажите, как перегрузить оператор сравнения == и другие? попробовал bool operator == (char* A,char* B) выдает : оператору ,не являющемуся...


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

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
BOINC: 22 года — и всё ещё работает
Programma_Boinc 12.03.2026
BOINC: 22 года — и всё ещё работает Дэвид Андерсон написал ретроспективу. Кратко: в 2001 году он ушёл из United Devices, где был CTO, и за несколько месяцев написал ядро BOINC — клиент, сервер,. . .
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru