43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
1

см. объявление "std::operator +"

21.09.2013, 17:09. Показов 1979. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Что-то не могу понять что не так в operator+.
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
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
#include <iostream>
#include <vector>
#include <algorithm>
#include <numeric>
#include <iterator>
 
 
using namespace std;
 
const int size=10;
 
class Money{
    friend ostream &operator<<(ostream&out, const Money M){
        out<<M.m;
        return out;
    }
public:
    int m;
public:
    Money() : m(0){}
    Money(int a) : m(a){}
    bool operator<(Money M){
        return m < M.m;
    }
    bool operator>(Money &M){
        return m > M.m;
    }
    Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
    Money& operator++(){
        m++;
        return *this;
    }
    Money& operator++(int){
        m++;
        return *this;
    }
    bool operator==(Money src){
        return (m == src.m);
    }
    Money& operator=(Money M){
        m = M.m;
        return *this;
    }
};
 
 
class Sum{
    
private:
    double sum;
public:
    Sum(double s) : sum(s){}
    void operator()(Money &x){
        x.m += sum;
    }
};
 
 
int main(){
    
    vector <Money> money;
 
    for(int i=0;i<size;i++)
        money.push_back(Money(rand()%10));
    cout<<"You array: ";
    copy(money.begin(),money.end(),ostream_iterator <Money>(cout, " " ));
    cout<<endl;
    vector<Money>::iterator max = max_element(money.begin(),money.end());
    cout<<"Max element: "<<*max<<endl;
    money.insert(money.begin(),*max);
    vector<Money>::iterator min = min_element(money.begin(),money.end());
    cout<<"Max element: "<<*min<<endl;
    money.erase(min);
    double sum=accumulate(money.begin(), money.end(),0)/money.size();
    cout<<"Suma/size(): "<<sum<<endl;
    for_each(money.begin(),money.end(),Sum(sum));
    cout<<"Array after replacing: ";
    copy(money.begin(),money.end(),ostream_iterator <Money>(cout, " " ));
    
    system("pause>0");
    return 0;
}
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
21.09.2013, 17:09
Ответы с готовыми решениями:

no match for ‘operator<<’ (operand types are ‘std::ostream’ {aka ‘std::basic_ostream’} and ‘’)
#include&lt;iostream&gt; #include&lt;cmath&gt; #include&lt;conio.h&gt; using namespace std; struct complex...

No match for 'operator<' (operand types are 'std::__cxx11::string {aka std::__c
Имеем следующий код: #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;vector&gt; #include...

Error: ambiguous overload for 'operator<<' (operand types are 'std::ofstream {aka std::basic_ofstream<char>}'
на #define LOG(Variable) Log&lt;&lt;&quot;&lt;&quot;;...

Проблемы с выводом вектора. error: no match for 'operator<<' (operand types are 'std::ostream' {aka 'std::basic_ostream<
Занимаюсь изучением C++, столкнулся с такой проблемой: Код: #include &lt;iostream&gt; #include...

15
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.09.2013, 17:12 2
и где этот оператор + ?
0
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
21.09.2013, 17:13  [ТС] 3
Цитата Сообщение от Jupiter Посмотреть сообщение
и где этот оператор + ?
C++
1
2
3
4
5
Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
0
Каратель
Эксперт С++
6609 / 4028 / 401
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
21.09.2013, 17:14 4
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.09.2013, 17:15 5
Цитата Сообщение от Insane__ Посмотреть сообщение
Money& operator++(){
* * * * m++;
* * * * return *this;
* * }
* * Money& operator++(int){
* * * * m++;
* * * * return *this;
* * }
тут тоже ошибка
0
43 / 43 / 15
Регистрация: 10.09.2013
Сообщений: 293
21.09.2013, 17:18  [ТС] 6
Цитата Сообщение от Кудаив Посмотреть сообщение
тут тоже ошибка
Я знаю, что там нужно возвращать копию а не оригинал.
Цитата Сообщение от Jupiter Посмотреть сообщение
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
Возвращаю копию, но ошибок меньше не становится.
Кликните здесь для просмотра всего текста
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
40
41
42
43
44
45
46
47
48
1>------ Построение начато: проект: lab1, Конфигурация: Debug Win32 ------
1>Построение начато 21.09.2013 16:15:26.
1>InitializeBuildStatus:
1>  Обращение к "Debug\lab1.unsuccessfulbuild".
1>ClCompile:
1>  main.cpp
1>c:\users\андрей\documents\visual studio 2010\projects\lab1\lab1\main.cpp(58): warning C4244: +=: преобразование "double" в "int", возможна потеря данных
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::move_iterator<_RanIt> std::operator +(_Diff,const std::move_iterator<_RanIt> &): не удалось вывести аргумент шаблон для "const std::move_iterator<_RanIt> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\iterator(336): см. объявление "std::operator +"
1>          c:\program files\microsoft visual studio 10.0\vc\include\numeric(26): см. ссылку на создание экземпляров функции шаблон при компиляции "_Ty std::_Accumulate<Money*,_Ty>(_InIt,_InIt,_Ty)"
1>          with
1>          [
1>              _Ty=int,
1>              _InIt=Money *
1>          ]
1>          c:\users\андрей\documents\visual studio 2010\projects\lab1\lab1\main.cpp(78): см. ссылку на создание экземпляров функции шаблон при компиляции "_Ty std::accumulate<std::_Vector_iterator<_Myvec>,int>(_InIt,_InIt,_Ty)"
1>          with
1>          [
1>              _Ty=int,
1>              _Myvec=std::_Vector_val<Money,std::allocator<Money>>,
1>              _InIt=std::_Vector_iterator<std::_Vector_val<Money,std::allocator<Money>>>
1>          ]
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vb_iterator<_Alloc> std::operator +(_Alloc::difference_type,std::_Vb_iterator<_Alloc>): не удалось вывести аргумент шаблон для "std::_Vb_iterator<_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(1985): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vb_const_iterator<_Alloc> std::operator +(_Alloc::difference_type,std::_Vb_const_iterator<_Alloc>): не удалось вывести аргумент шаблон для "std::_Vb_const_iterator<_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(1878): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vector_iterator<_Myvec> std::operator +(_Vector_iterator<_Myvec>::difference_type,std::_Vector_iterator<_Myvec>): не удалось вывести аргумент шаблон для "std::_Vector_iterator<_Myvec>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(407): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Vector_const_iterator<_Myvec> std::operator +(_Vector_const_iterator<_Myvec>::difference_type,std::_Vector_const_iterator<_Myvec>): не удалось вывести аргумент шаблон для "std::_Vector_const_iterator<_Myvec>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\vector(276): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_String_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_iterator<_Elem,_Traits,_Alloc>): не удалось вывести аргумент шаблон для "std::_String_iterator<_Elem,_Traits,_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xstring(434): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_String_const_iterator<_Elem,_Traits,_Alloc> std::operator +(_String_const_iterator<_Elem,_Traits,_Alloc>::difference_type,std::_String_const_iterator<_Elem,_Traits,_Alloc>): не удалось вывести аргумент шаблон для "std::_String_const_iterator<_Elem,_Traits,_Alloc>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xstring(293): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Array_iterator<_Ty,_Size> std::operator +(_Array_iterator<_Ty,_Size>::difference_type,std::_Array_iterator<_Ty,_Size>): не удалось вывести аргумент шаблон для "std::_Array_iterator<_Ty,_Size>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(2068): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Array_const_iterator<_Ty,_Size> std::operator +(_Array_const_iterator<_Ty,_Size>::difference_type,std::_Array_const_iterator<_Ty,_Size>): не удалось вывести аргумент шаблон для "std::_Array_const_iterator<_Ty,_Size>" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1929): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::reverse_iterator<_RanIt> std::operator +(_Diff,const std::reverse_iterator<_RanIt> &): не удалось вывести аргумент шаблон для "const std::reverse_iterator<_RanIt> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1323): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2784: std::_Revranit<_RanIt,_Base> std::operator +(_Diff,const std::_Revranit<_RanIt,_Base> &): не удалось вывести аргумент шаблон для "const std::_Revranit<_RanIt,_Base> &" из "Money"
1>          c:\program files\microsoft visual studio 10.0\vc\include\xutility(1136): см. объявление "std::operator +"
1>c:\program files\microsoft visual studio 10.0\vc\include\numeric(17): error C2677: бинарный "+": не найден глобальный оператор, принимающий тип "Money" (или приемлемое преобразование отсутствует)
1>
1>СБОЙ построения.
1>
1>Затраченное время: 00:00:00.95
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
0
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.09.2013, 17:23 7
Цитата Сообщение от Insane__ Посмотреть сообщение
Я знаю, что там нужно возвращать копию а не оригинал.
да можно и оригинал возвращать, просто что префиксный, что постфиксный делают одно и то же
0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
21.09.2013, 17:36 8
C++
1
2
3
4
Money& operator+(Money &M){
    m += M.m;
    return *this;
}
0
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 18:14 9
C++
1
2
3
4
5
6
7
int f(Money x, Money y)
{
    return x.m + y.m;
}
...
double sum = accumulate(money.begin(), money.end(), 0, f)/money.size();
...
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.09.2013, 19:11 10
C++
1
2
3
4
5
6
7
8
9
    Money operator + ( const Money & M ) const {
        return Money( m + M.m );
    }
 
    ...
 
    Money a(1), b(2), c;
    c = a + b;
    cout << c.m << endl;
_, оператор + не должен изменять значения в своем классе.
1
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
21.09.2013, 19:51 11
Цитата Сообщение от castaway Посмотреть сообщение
оператор + не должен изменять значения в своем классе
все зависит от того какой смысл вкладывает программист в оператор
0
Эксперт С++
4985 / 3092 / 456
Регистрация: 10.11.2010
Сообщений: 11,169
Записей в блоге: 10
21.09.2013, 20:09 12
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Я говорю про данный случай. Он же обычно общий.
0
gray_fox
21.09.2013, 20:11
  #13

Не по теме:

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

0
193 / 170 / 32
Регистрация: 09.09.2013
Сообщений: 522
21.09.2013, 20:13 14
Цитата Сообщение от castaway Посмотреть сообщение
_, оператор + не должен изменять значения в своем классе.
согласен. я вот не подумал и написал по быстрому.

ведь когда пишем z = x + y, то x и y не изменяются
1
5498 / 4893 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:15 15
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Хорошим стилем является, что оператор, перегруженный для класса, работает так же, как для встроенных типов.
Цитата Сообщение от _ Посмотреть сообщение
ведь когда пишем z = x + y, то x и y не изменяются
2
419 / 418 / 72
Регистрация: 27.05.2012
Сообщений: 1,168
22.09.2013, 06:44 16
Цитата Сообщение от alsav22 Посмотреть сообщение
как для встроенных типов

Не по теме:

таки я и не спорю - просто констатирую факт :)

0
22.09.2013, 06:44
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
22.09.2013, 06:44
Помогаю со студенческими работами здесь

main: пред-объявление и пост-объявление функций ;;; std::cout << ""; или using std::cout . cout << "";
Здравствуйте. Есть ли разница между объявлением функций до main и после? Влияет ли это на...

Объявление Operator = посреди кода
Всем доброго дня !!! Скажите пожалуйста, почему когда я в текст программы вставляю operator =...

std::istreambuf_iterator::operator!=
Интересно почему в C++20 удалят std::istreambuf_iterator::operator!=?

Выделение памяти для буффера, под std::istream& operator>>(std::istream &, String &)
Добрый день. Как осуществляется выделения памяти под перегруженный оператор ввода данных в...

Ошибка undefined reference to `operator<<(std::ostream&, Account)'
Всем здравствуйте! На днях столкнулся с ошибкой, с которой еще не раз не сталкивался, и не знаю как...

Ошибка undefined reference to `operator<<(std::ostream&, Complex const
Добрый вечер. Помогите, пожалуйста. Выдает ошибку, не понимаю что нужно сделать. Для main.cpp...


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

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

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru