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

Перегрузка оператора += - C++

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 12:03     Перегрузка оператора += #1
Есть два класса: Vec4(вектор из 4х float) и Mat4(вектор из 4х Vec4). Проблема в том что при перегрузке в Mat4 операции += я получаю ошибку компиляции
C++
1
2
3
4
5
In member function 'Mat4& Mat4::operator+=(Mat4&)':
error: no match for 'operator+=' in '((Mat4*)this)->Mat4::elem.std::vector<_Tp, _Alloc>::operator[] [with _Tp = Vec4, _Alloc = std::allocator<Vec4>](i) += Mat4::operator[](int)(((int)i))'|
33|note: candidates are: Vec4& Vec4::operator+=(Vec4&)|
109|note:             Vec4& Vec4::operator+=(float)|
||=== Build finished: 1 errors, 0 warnings ===|
Код Vec4 (работающий). Перегрузку +, +=, = и индексации специально поднял вверх, ниже идут остальные перегрузки, которые с ошибкой явно не связаны и их можно сейчас не рассматривать.
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#ifndef VEC4_H
#define VEC4_H
 
#include <vector>
#include <iostream>
using namespace std;
 
class Vec4
{
    vector<float> elem;
 
    public:
    class Out_of_bounds{};
    Vec4(float a,float b,float c, float d)
    {
        elem.resize(4);
        elem[0]=a;elem[1]=b;elem[2]=c;elem[3]=d;
    }
 
    Vec4()
    {
        elem.resize(4);
        elem[0]=elem[1]=elem[2]=elem[3]=1;
    }
 
    Vec4(const Vec4& right)
    {
        elem.resize(4);
        for (size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
    }
    
 
    Vec4 &operator+=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]+=right[i];
        }
        return *this;
    }
 
    Vec4 operator+(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp+=right;
        }
        return temp;
    }
    
    
    Vec4 &operator +=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]+=right;
        }
        return *this;
    }
 
    Vec4 operator+(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp+=right;
        }
        return temp;
    }
    
        Vec4 operator=(Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
 
    Vec4 operator=(const Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
 
    float operator[](int i) const
    {
        return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
    }
 
    float operator[](int i)
    {
        return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
    }
 
    Vec4 &operator-=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]-=right[i];
        }
        return *this;
    }
 
    Vec4 operator-(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp-=right;
        }
        return temp;
    }
 
    Vec4 &operator *=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]*=right[i];
        }
        return *this;
    }
 
    Vec4 operator*(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp*=right;
        }
        return temp;
    }
 
    Vec4 &operator /=(Vec4 &right)
    {
        for (size_t i=0;elem.size();i++)
        {
            elem[i]/=right[i];
        }
        return *this;
    }
 
    Vec4 operator/(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;elem.size();i++)
        {
            temp/=right;
        }
        return temp;
    }
 
 
    Vec4 &operator -=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]-=right;
        }
        return *this;
    }
 
    Vec4 operator-(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp-=right;
 
        return temp;
    }
 
    Vec4 &operator *=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]*=right;
        }
        return *this;
    }
 
    Vec4 operator*(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp*=right;
 
        return temp;
    }
 
    Vec4 &operator /=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]/=right;
        }
        return *this;
    }
 
    Vec4 operator/(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp/=right;
 
        return temp;
    }
 
    void print()
    {
        for(size_t i=0;i<elem.size();i++)
         cout<<elem[i]<<'\t';
        cout<<endl;
    }
};
 
#endif
Код Mat4 где ошибка при перегрузке Mat4 &operator+=(Mat4 &right)
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
#include "Vec4.h"
 
class Mat4
{
    vector<Vec4> elem;
 
public:
    Mat4(const Vec4 &x)
    {
        elem.resize(4);
        for (size_t i=0;i<elem.size();i++)
        elem[i]=x;
    }
 
    Mat4()
    {
        elem.resize(4);
        Vec4 temp;
        for (size_t i=0;i<elem.size();i++)
         elem[i]=temp;
    }
 
    Vec4 operator[](int i)
    {
        return ((i>=0) && (i<=3) ? elem[i] : throw Vec4::Out_of_bounds());
    }
 
    Vec4 operator[](int i) const
    {
        return ((i>=0) && (i<=3) ? elem[i] : throw Vec4::Out_of_bounds());
    }
 
    Mat4 operator=(Mat4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
 
        return *this;
    }
 
    Mat4 &operator+=(Mat4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
         elem[i]+=right[i];
 
        return *this;
    }
};
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
27.09.2011, 12:03     Перегрузка оператора +=
Посмотрите здесь:

C++ Перегрузка оператора %
Перегрузка оператора = C++
Перегрузка оператора C++
C++ перегрузка оператора
C++ Перегрузка оператора
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
-=ЮрА=-
Заблокирован
Автор FAQ
27.09.2011, 12:17     Перегрузка оператора += #2
Gepar, как вообще звучит задание к этой лабе????

Не по теме:

Мне не охота копаться в классе Mat4, т.к считаю можно проще сделать(без обид)

Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 13:04  [ТС]     Перегрузка оператора += #3
Задание так и звучит, создать именно вектор и именно из 4х таких элементов. Копаться особо и не надо, мне только напишите чего оно в Mat4 не видит перегрузку += в Vec4, точнее находит обе перегрузки (и для Vec4 и для float) и при этом ругается.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 13:13     Перегрузка оператора += #4
Добавь в конструкторах слово explicit.
-=ЮрА=-
Заблокирован
Автор FAQ
27.09.2011, 13:26     Перегрузка оператора += #5
Цитата Сообщение от Gepar Посмотреть сообщение
return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
-
у меня ругань сюда и сюда
Цитата Сообщение от Gepar Посмотреть сообщение
return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
Добавлено через 50 секунд
Как по мне это странновато вместо float возвращать void от trow

Добавлено через 3 минуты
Заменил все trow вот так
C++
1
return ((i>=0) && (i<=3) ? elem[i] : 0);//throw Vec4::Out_of_bounds());
Теперь ругань такая
Vec4 operator[](int i)
mat4.h(25) : error C2664: '__thiscall Vec4::Vec4(const class Vec4 &)' : cannot convert parameter 1 from '' to 'const class Vec4 &'

Vec4 operator[](int i) const
mat4.h(30) : error C2664: '__thiscall Vec4::Vec4(const class Vec4 &)' : cannot convert parameter 1 from '' to 'const class Vec4 &'

Добавлено через 1 минуту
Вдобавок
Vec4 operator[](int i)
mat4.h(25) : error C2446: ':' : no conversion from 'const int' to 'class Vec4'
No constructor could take the source type, or constructor overload resolution was ambiguous

Может всё таки дело не в перегрузке оператора +???

Добавлено через 5 минут
Deviaphan, как может помочь запрет автоматического создания конвертирующего конструктора?
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 13:38     Перегрузка оператора += #6
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
запрет автоматического создания
Не создание, а неявный вызов. В случае с неразрешёнными перегрузками частенько дело может быть именно в этом. И вообще, это просто хороший тон программирования. Так же, как и передавать константный аргумент в методы копирования и присваивания.
-=ЮрА=-
Заблокирован
Автор FAQ
27.09.2011, 14:29     Перегрузка оператора += #7
Gepar, как я помню ты пишешь лабы в 6-ке, так вот компилятор ругается на перегрузку этих операторов
C++
1
2
3
4
Vec4 operator[](int i)
    {
        return ((i>=0) && (i<=3) ? elem[i] : 0);//throw Vec4::Out_of_bounds());
    }
d:\ìîè äîêóìåíòû\þðà\ëè÷íîå\projects\cvector\mat4.h(25) : error C2446: ':' : no conversion from 'const int' to 'class Vec4'
No constructor could take the source type, or constructor overload resolution was ambiguous
d:\ìîè äîêóìåíòû\þðà\ëè÷íîå\projects\cvector\mat4.h(25) : error C2664: '__thiscall Vec4::Vec4(const class Vec4 &)' : cannot convert parameter 1 from '' to 'const class Vec4 &'


C++
1
2
3
4
    Vec4 operator[](int i) const
    {
        return ((i>=0) && (i<=3) ? elem[i] : 0);//throw Vec4::Out_of_bounds());
    }
d:\ìîè äîêóìåíòû\þðà\ëè÷íîå\projects\cvector\mat4.h(30) : error C2446: ':' : no conversion from 'const int' to 'const class Vec4'
No constructor could take the source type, or constructor overload resolution was ambiguous
d:\ìîè äîêóìåíòû\þðà\ëè÷íîå\projects\cvector\mat4.h(30) : error C2664: '__thiscall Vec4::Vec4(const class Vec4 &)' : cannot convert parameter 1 from '' to 'const class Vec4 &'

Я без всяких притензий Мне тоже не очень понятно как можно пользоваться индексным оператором elem[i] в теле перегрузки данного оператора???
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 15:54     Перегрузка оператора += #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Мне тоже не очень понятно как можно пользоваться индексным оператором elem[i] в теле перегрузки данного оператора?
Там vector<float>, а не vector<Vec4>, просто у ТС имена одинаковые.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 16:39  [ТС]     Перегрузка оператора += #9
Цитата Сообщение от Deviaphan Посмотреть сообщение
Добавь в конструкторах слово explicit.
В каких именно? В конструкторах по умолчанию не принимающих аргументы?

Добавлено через 31 секунду
-=ЮрА=-, конкретно этот код комплиировал minigw так что он не ругается на выброс исключений таким хитрым способом.

Добавлено через 3 минуты
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
mat4.h(25) : error C2446: ':' : no conversion from 'const int' to 'class Vec4'
No constructor could take the source type, or constructor overload resolution was ambiguous
Ну это ты уже сам ошибку создал добавив что возвращаться будет int, а не Vec4, можешь поставить чтобы тут возвращало Vec4[0], это будет не правильно в плане того куда будет обращение, но будет работать и не вываливаться.

Добавлено через 1 минуту
-=ЮрА=-, сделай так
C++
1
2
3
4
    Vec4 operator[](int i) const
    {
        return ((i>=0) && (i<=3) ? elem[i] : elem[0]);//throw Vec4::Out_of_bounds());
    }
И будет комплиироваться, там возврат i элемента Vec4, сделано как в двумерном массиве чтобы в коде main обращаться типа a[2][3].

Добавлено через 1 минуту
Кстати насчёт throw в тернарном операторе: я сам думал что так работать не будет, но mingw скомпилировал всё как положено и при выходе за границы и правда выбрасывается исключение, которое также успешно ловится так что работает всё корректно.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 16:41     Перегрузка оператора += #10
Vec4(const Vec4& right)
Mat4(const Vec4 &x)
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 16:53  [ТС]     Перегрузка оператора += #11
И ещё раз по поводу моей ошибки: minigw пишет что нет кандидата на вызов +=
и дальше пишет кандидат 1 += для Vec4 и кандидат 2 для += это float, мне бы надо чтобы вызывался 1ый кандидат так как он вообще-то и подходит по семантике и вроде всё хорошо, но компилятору же что-то не нравится ...
Хотя ... ошибка явно где-то в перегрузке в Vec4 - я попробовал в Main проделать следующее:
C++
1
2
3
4
    vector<Vec4> elem;
    elem.resize(4);
    for (size_t i=0;i<elem.size();i++)
     elem[i]+=right[i];
и код тоже не скомпилировался, ну чтоже, круг поиска ошибки стал уже

Добавлено через 1 минуту
Deviaphan, тогда это не работает
C++
1
2
3
4
5
6
7
8
9
    Vec4 operator+(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp+=right;
        }
        return temp; // ОШИБКА 50|error: no matching function for call to 'Vec4::Vec4(Vec4&)'|
    }
Добавлено через 41 секунду
Ну и все остальные функции где возвращается temp пишут ошибку + не работает и такой вариант:
C++
1
2
3
4
5
6
        Vec4 operator=(Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
Добавлено через 1 минуту
Хотя последнее это понятно почему, его исправил, но все остальные где возвращается temp теперь не компилируются

Добавлено через 46 секунд
Ну и вообще оно понятно почему они не работают, конструктор копирования то нельзя теперь не явно вызывать, но как же мне тогда поступать?

Добавлено через 5 минут
Deviaphan, Вы не поняли, сделав
C++
1
2
3
4
5
6
    explicit Vec4(const Vec4& right)
    {
        elem.resize(4);
        for (size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
    }
Я же не могу нигде возвращать результат в функции вроде этой
C++
1
2
3
4
5
6
7
8
    Vec4 operator/(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp/=right;
 
        return temp; // ОШИБКА
    }
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 16:53     Перегрузка оператора += #12
Mat4 = Mat4( vec4 + vec4 );
Но сперва сделать все аргументы константными ссылками (коими они и должны были быть изначально). Методы не изменяющие состояние должны быть константными.
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 16:58  [ТС]     Перегрузка оператора += #13
Давайте пока забудем о Mat4, ошибка я вижу не в нём
Допустим имеем Vec4 (изменения насчёт того чтобы возвращалась ссылка на элемент внёс, но теперь компилятор кое-где ругается что мол возвращается ссылка на локальную переменную ...)
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
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
#ifndef VEC4_H
#define VEC4_H
 
#include <vector>
#include <iostream>
using namespace std;
 
class Vec4
{
    vector<float> elem;
 
    public:
    class Out_of_bounds{};
    Vec4(float a,float b,float c, float d)
    {
        elem.resize(4);
        elem[0]=a;elem[1]=b;elem[2]=c;elem[3]=d;
    }
 
    Vec4()
    {
        elem.resize(4);
        elem[0]=elem[1]=elem[2]=elem[3]=1;
    }
 
    explicit Vec4(const Vec4& right)
    {
        elem.resize(4);
        for (size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
    }
 
 
    Vec4 &operator+=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]+=right[i];
        }
        return *this;
    }
 
    Vec4 &operator+(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp+=right;
        }
        return temp;
    }
 
 
    Vec4 &operator +=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]+=right;
        }
        return *this;
    }
 
    Vec4 &operator+(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp+=right;
        }
        return temp;
    }
 
    Vec4 &operator=(Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
 
    Vec4 &operator=(const Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
 
    float operator[](int i) const
    {
        return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
    }
 
    float operator[](int i)
    {
        return ((i>=0) && (i<4) ? elem[i] : throw Out_of_bounds());
    }
 
    Vec4 &operator-=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]-=right[i];
        }
        return *this;
    }
 
    Vec4 &operator-(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp-=right;
        }
        return temp;
    }
 
    Vec4 &operator *=(Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]*=right[i];
        }
        return *this;
    }
 
    Vec4 &operator*(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp*=right;
        }
        return temp;
    }
 
    Vec4 &operator /=(Vec4 &right)
    {
        for (size_t i=0;elem.size();i++)
        {
            elem[i]/=right[i];
        }
        return *this;
    }
 
    Vec4 &operator/(Vec4 &right)
    {
        Vec4 temp(*this);
        for (size_t i=0;elem.size();i++)
        {
            temp/=right;
        }
        return temp;
    }
 
 
    Vec4 &operator -=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]-=right;
        }
        return *this;
    }
 
    Vec4 &operator-(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp-=right;
 
        return temp;
    }
 
    Vec4 &operator *=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]*=right;
        }
        return *this;
    }
 
    Vec4 &operator*(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp*=right;
 
        return temp;
    }
 
    Vec4 &operator /=(float right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]/=right;
        }
        return *this;
    }
 
    Vec4 &operator/(float right)
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
         temp/=right;
 
        return temp;
    }
 
    void print()
    {
        for(size_t i=0;i<elem.size();i++)
         cout<<elem[i]<<'\t';
        cout<<endl;
    }
};
 
#endif
и main
C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector>
using namespace std;
 
int main()
{
    vector<Vec4> elem;
    elem.resize(4);
    for (size_t i=0;i<elem.size();i++)
     elem[i]+=right[i]; // не работает
}
Проблема: оператор += перегружен не корректно и не работает.
-=ЮрА=-
Заблокирован
Автор FAQ
27.09.2011, 17:09     Перегрузка оператора += #14
Gepar,
Цитата Сообщение от Gepar Посмотреть сообщение
но mingw скомпилировал всё как положено
он отработает и для такого, причём успешно, я сам был пару дней назад чуть мировоззрение не поменял
C++
1
2
3
int count;
cin>>count;
int arr[count];
- шестёрка хоть и скомпилит но обломиться от такого, тут уже подстраивайся под среду в которой сдавать лабы будешь а не ту в которой удобно писать

Добавлено через 3 минуты

Не по теме:

Gepar, помню недавно писал что именно 6-ка для приёма лаб, так вот ругань компилятора как раз из шестёрки, я без обид хочу чтобы ты понял в случае компилирования твоего кода при сдаче может получиться неприятный сюрприз

Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 17:10     Перегрузка оператора += #15
Ты не правильно понял и написал. Я имел в виду по типу такого:
C++
1
2
3
4
5
6
7
8
9
    Vec4 operator-( const Vec4 &right) const
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp-=right;
        }
        return temp;
    }
Разумеется, на локальные объекты ссылку возвращать нельзя!
Jupiter
Каратель
Эксперт C++
6543 / 3963 / 226
Регистрация: 26.03.2010
Сообщений: 9,273
Записей в блоге: 1
Завершенные тесты: 2
27.09.2011, 17:12     Перегрузка оператора += #16
deleted
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 17:31  [ТС]     Перегрузка оператора += #17
-=ЮрА=-, это не для сдачи, это задание из книги Страуструпа.

Добавлено через 6 минут
Deviaphan, Вы не поняли, сделав
C++
1
2
3
4
5
6
    explicit Vec4(const Vec4& right)
    {
        elem.resize(4);
        for (size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
    }
Я же не могу нигде возвращать результат в функции вроде этой

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    Vec4 &operator-=(const Vec4 &right)
    {
        for (size_t i=0;i<elem.size();i++)
        {
            elem[i]-=right[i];
        }
        return *this;
    }
 
    Vec4 operator-(const Vec4 &right) const
    {
        Vec4 temp(*this);
        for (size_t i=0;i<elem.size();i++)
        {
            temp-=right;
        }
        return temp;  // ОШИБКА |113|error: no matching function for call to 'Vec4::Vec4(Vec4&)'|
    }
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 17:33     Перегрузка оператора += #18
Можешь!
Это одно и то же. Первое удали.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    Vec4 &operator=(Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
 
    Vec4 &operator=(const Vec4 &right)
    {
        for(size_t i=0;i<elem.size();i++)
         elem[i]=right[i];
        return *this;
    }
Gepar
 Аватар для Gepar
1173 / 529 / 20
Регистрация: 01.07.2009
Сообщений: 3,512
27.09.2011, 17:38  [ТС]     Перегрузка оператора += #19
Если же убрать explicit и сделать всюду как посоветовал Deviaphan то ошибки насчёт возврата локальных переменных исчезнут, а в main где написано
C++
1
 elem[i]+=right[i]
пишет сначала предупреждение по поводу этой строки
warning: pointer to a function used in arithmetic|
А потом уже ошибки
C++
1
2
3
4
5
6
C:\c++\Projects\Temp\main.cpp||In function 'int main()':|
C:\c++\Projects\Temp\main.cpp|24|warning: pointer to a function used in arithmetic|
C:\c++\Projects\Temp\main.cpp|24|error: no match for 'operator+=' in 'elem.std::vector<_Tp, _Alloc>::operator[] [with _Tp = Vec4, _Alloc = std::allocator<Vec4>](i) += *(std::right + ((unsigned int)i))'|
C:\c++\Projects\Temp\Vec4.h|34|note: candidates are: Vec4& Vec4::operator+=(Vec4&)|
C:\c++\Projects\Temp\Vec4.h|54|note:                 Vec4& Vec4::operator+=(float)|
||=== Build finished: 1 errors, 1 warnings ===|
Что значит pointer to a function used in arithmetic|? У меня оператор перегружен, а не функцию, указателей у меня там нету, как такое могло получиться?
На всякий случай прикрепил Vec4.h + main.cpp в виде архива, возможно так будет удобнее чтобы посмотреть файл в привычном редакторе.
Вложения
Тип файла: zip Vec4.zip (931 байт, 4 просмотров)
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 18:02     Перегрузка оператора +=
Еще ссылки по теме:

C++ Перегрузка оператора ++
Перегрузка оператора *= C++
C++ Перегрузка оператора ++

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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
 Аватар для Deviaphan
1283 / 1217 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 18:02     Перегрузка оператора += #20
Указатель на функцию используется в арифметическом выражениии...

Добавлено через 7 минут
Про explicit для Vec4 я погорячился.) Он там не нужен.

Добавлено через 3 минуты
"Твою ж мать!"
C++
1
2
3
4
5
6
7
8
9
using namespace std;
 
int main()
{
    vector<Vec4> elem;
    elem.resize(4);
    for (size_t i=0;i<elem.size();i++)
     elem[i]+=[B]right[i][/B];
}
Ничего создать не забыл?

А std::right это манипулятор, который ты пытаешься использовать, как функцию.

Добавлено через 23 секунды
Жирненько не получилось выделить.(

Добавлено через 44 секунды
И у тебя там лишние методы для Vec4, надо почистить.

Добавлено через 1 минуту
Собственно, нужно просто внимательнее читать сообщение: *(std::right + ((unsigned int)i))
Адрес функции std::right пытается сдвинуться на , чего для адресов функции не предусмотрено.
А я ещё понять не мог, чего он такого странного пишет.
Yandex
Объявления
27.09.2011, 18:02     Перегрузка оператора +=
Ответ Создать тему
Опции темы

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