Форум программистов, компьютерный форум CyberForum.ru

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

Восстановить пароль Регистрация
 
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
21.09.2013, 17:09     см. объявление "std::operator +" #1
Что-то не могу понять что не так в 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;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
21.09.2013, 17:09     см. объявление "std::operator +"
Посмотрите здесь:

C++ error C2040: key: "int [256]" отличается по уровням косвенного обращения от "std::ofstream"
error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::basic_istream<_Elem,_Traits>" C++
C++ Исправить ошибку:error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
C++ Error C2440: <function-style-cast>: невозможно преобразовать "unsigned int" в "std::bitset<_Bits>"
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:12     см. объявление "std::operator +" #2
и где этот оператор + ?
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
21.09.2013, 17:13  [ТС]     см. объявление "std::operator +" #3
Цитата Сообщение от Jupiter Посмотреть сообщение
и где этот оператор + ?
C++
1
2
3
4
5
Money& operator+(Money &M){
        Money tmp;
        tmp.m = M.m + m;
        return tmp;
    }
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
21.09.2013, 17:14     см. объявление "std::operator +" #4
ты возвращаешь ссылку на локальную переменную, оператор+ должен возвращать копию
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
21.09.2013, 17:15     см. объявление "std::operator +" #5
Цитата Сообщение от Insane__ Посмотреть сообщение
Money& operator++(){
* * * * m++;
* * * * return *this;
* * }
* * Money& operator++(int){
* * * * m++;
* * * * return *this;
* * }
тут тоже ошибка
Insane__
43 / 42 / 4
Регистрация: 10.09.2013
Сообщений: 292
21.09.2013, 17:18  [ТС]     см. объявление "std::operator +" #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 ==========
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
21.09.2013, 17:23     см. объявление "std::operator +" #7
Цитата Сообщение от Insane__ Посмотреть сообщение
Я знаю, что там нужно возвращать копию а не оригинал.
да можно и оригинал возвращать, просто что префиксный, что постфиксный делают одно и то же
User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
21.09.2013, 17:36     см. объявление "std::operator +" #8
C++
1
2
3
4
Money& operator+(Money &M){
    m += M.m;
    return *this;
}
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 18:14     см. объявление "std::operator +" #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();
...
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 19:11     см. объявление "std::operator +" #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;
_, оператор + не должен изменять значения в своем классе.
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
21.09.2013, 19:51     см. объявление "std::operator +" #11
Цитата Сообщение от castaway Посмотреть сообщение
оператор + не должен изменять значения в своем классе
все зависит от того какой смысл вкладывает программист в оператор
castaway
Эксперт С++
4848 / 2987 / 368
Регистрация: 10.11.2010
Сообщений: 11,028
Записей в блоге: 10
Завершенные тесты: 1
21.09.2013, 20:09     см. объявление "std::operator +" #12
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Я говорю про данный случай. Он же обычно общий.
gray_fox
21.09.2013, 20:11
  #13

Не по теме:

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

User409368
191 / 168 / 6
Регистрация: 09.09.2013
Сообщений: 524
21.09.2013, 20:13     см. объявление "std::operator +" #14
Цитата Сообщение от castaway Посмотреть сообщение
_, оператор + не должен изменять значения в своем классе.
согласен. я вот не подумал и написал по быстрому.

ведь когда пишем z = x + y, то x и y не изменяются
alsav22
5282 / 4801 / 442
Регистрация: 04.06.2011
Сообщений: 13,587
21.09.2013, 20:15     см. объявление "std::operator +" #15
Цитата Сообщение от Кудаив Посмотреть сообщение
все зависит от того какой смысл вкладывает программист в оператор
Хорошим стилем является, что оператор, перегруженный для класса, работает так же, как для встроенных типов.
Цитата Сообщение от _ Посмотреть сообщение
ведь когда пишем z = x + y, то x и y не изменяются
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
22.09.2013, 06:44     см. объявление "std::operator +"
Еще ссылки по теме:

Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" C++
Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" C++
Error C2664: Client::First: невозможно преобразовать параметр 1 из "std::queue<_Ty>" в "std::queue<_Ty> &" C++

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

Или воспользуйтесь поиском по форуму:
Кудаив
329 / 406 / 24
Регистрация: 27.05.2012
Сообщений: 1,163
Завершенные тесты: 2
22.09.2013, 06:44     см. объявление "std::operator +" #16
Цитата Сообщение от alsav22 Посмотреть сообщение
как для встроенных типов

Не по теме:

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

Yandex
Объявления
22.09.2013, 06:44     см. объявление "std::operator +"
Ответ Создать тему
Опции темы

Текущее время: 21:59. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru