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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 13, средняя оценка - 4.77
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
#1

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

27.09.2011, 12:03. Просмотров 1615. Ответов 33
Метки нет (Все метки)

Есть два класса: 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++
Для чего она вообще и как её использовать? Черканите, если не трудно, &quot;детский&quot; примерчик !

Перегрузка оператора ++ - C++
Нужно создать операторы префиксного и постфиксного инкремента для приращения переменной itsRadius класса SimpleCircle. Переменная itsRadius...

Перегрузка оператора - C++
Доброго времени суток! Помогите, пожалуйста, с решением задачи: Описать класс множество целых чисел. Перегрузить следующую операцию: +...

Перегрузка оператора = - C++
Есть некий класс. И два класса-наследника. Надо перегрузить оператор =, к тому же в дочерних классах вызывать перегрузку в базовом классе....

Перегрузка оператора ~ - C++
Доброго времени суток! Помогите пожалуйста с решением задачи. Описать класс множество целых чисел. Перегрузить следующую операцию: ~...

Перегрузка оператора - C++
Здравствуйте! Помогите разобраться с перегрузкой операторов. Суть задания: Осуществите перегрузку оператора “++” так, чтобы при его...

Перегрузка оператора ++ - C++
Написал префиксную перегрузку ++ Vremya &amp;Vremya::operator ++ () { int sec = getSec(*this); //перевод в секунды ...

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

Не по теме:

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

Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
27.09.2011, 13:04  [ТС]     Перегрузка оператора += #3
Задание так и звучит, создать именно вектор и именно из 4х таких элементов. Копаться особо и не надо, мне только напишите чего оно в Mat4 не видит перегрузку += в Vec4, точнее находит обе перегрузки (и для Vec4 и для float) и при этом ругается.
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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++
1286 / 1220 / 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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 15:54     Перегрузка оператора += #8
Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
Мне тоже не очень понятно как можно пользоваться индексным оператором elem[i] в теле перегрузки данного оператора?
Там vector<float>, а не vector<Vec4>, просто у ТС имена одинаковые.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 16:41     Перегрузка оператора += #10
Vec4(const Vec4& right)
Mat4(const Vec4 &x)
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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++
1286 / 1220 / 50
Регистрация: 22.03.2011
Сообщений: 3,744
27.09.2011, 16:53     Перегрузка оператора += #12
Mat4 = Mat4( vec4 + vec4 );
Но сперва сделать все аргументы константными ссылками (коими они и должны были быть изначально). Методы не изменяющие состояние должны быть константными.
Gepar
1175 / 531 / 20
Регистрация: 01.07.2009
Сообщений: 3,517
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-ка для приёма лаб, так вот ругань компилятора как раз из шестёрки, я без обид хочу чтобы ты понял в случае компилирования твоего кода при сдаче может получиться неприятный сюрприз

MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
27.09.2011, 17:10     Перегрузка оператора +=
Еще ссылки по теме:

Перегрузка оператора - C++
Имеется время, например 12:12:12 Перегрузка инкремента Time &amp;Time::operator ++ () { Next(); return *this; } ...

Перегрузка оператора >> - C++
Не понимаю, в чем проблема при перегрузке операторов &lt;&lt; &gt;&gt; прочитал много статей, сделал как в примере, но msvs 2013 выдает ошибку: ...

Перегрузка оператора - C++
Здравствуйте. Нужна помощь) Есть такой класс: class vect { public: float *items; vect() { items = new float; for(int...

Перегрузка оператора [] - C++
При перегрузке оператора возникли проблемы, подскажыте как правильно перегрузить этот оператор, чтоб можно было устанавливать и получать...

Перегрузка оператора - C++
#include &lt;iostream&gt; class Node { public: char *s; int length; Node * next; public: Node(); Node(char* val) {


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

Или воспользуйтесь поиском по форуму:
Deviaphan
Делаю внезапно и красиво
Эксперт C++
1286 / 1220 / 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;
    }
Разумеется, на локальные объекты ссылку возвращать нельзя!
Yandex
Объявления
27.09.2011, 17:10     Перегрузка оператора +=
Ответ Создать тему
Опции темы

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