1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||
1 | ||||||||||||||||
Перегрузка оператора +=27.09.2011, 12:03. Показов 2756. Ответов 33
Метки нет (Все метки)
Есть два класса: Vec4(вектор из 4х float) и Mat4(вектор из 4х Vec4). Проблема в том что при перегрузке в Mat4 операции += я получаю ошибку компиляции
0
|
27.09.2011, 12:03 | |
Ответы с готовыми решениями:
33
Перегрузка оператора ~ Перегрузка оператора + Перегрузка оператора *= Перегрузка оператора |
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|
27.09.2011, 13:04 [ТС] | 3 |
Задание так и звучит, создать именно вектор и именно из 4х таких элементов. Копаться особо и не надо, мне только напишите чего оно в Mat4 не видит перегрузку += в Vec4, точнее находит обе перегрузки (и для Vec4 и для float) и при этом ругается.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.09.2011, 13:13 | 4 |
Добавь в конструкторах слово explicit.
1
|
Заблокирован
|
||||||
27.09.2011, 13:26 | 5 | |||||
-
у меня ругань сюда и сюда Добавлено через 50 секунд Как по мне это странновато вместо float возвращать void от trow Добавлено через 3 минуты Заменил все trow вот так
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, как может помочь запрет автоматического создания конвертирующего конструктора?
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.09.2011, 13:38 | 6 |
Не создание, а неявный вызов. В случае с неразрешёнными перегрузками частенько дело может быть именно в этом. И вообще, это просто хороший тон программирования. Так же, как и передавать константный аргумент в методы копирования и присваивания.
0
|
Заблокирован
|
|||||||||||
27.09.2011, 14:29 | 7 | ||||||||||
Gepar, как я помню ты пишешь лабы в 6-ке, так вот компилятор ругается на перегрузку этих операторов
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 &'
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] в теле перегрузки данного оператора???
1
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.09.2011, 15:54 | 8 |
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||
27.09.2011, 16:39 [ТС] | 9 | |||||
В каких именно? В конструкторах по умолчанию не принимающих аргументы?
Добавлено через 31 секунду -=ЮрА=-, конкретно этот код комплиировал minigw так что он не ругается на выброс исключений таким хитрым способом. Добавлено через 3 минуты Ну это ты уже сам ошибку создал добавив что возвращаться будет int, а не Vec4, можешь поставить чтобы тут возвращало Vec4[0], это будет не правильно в плане того куда будет обращение, но будет работать и не вываливаться. Добавлено через 1 минуту -=ЮрА=-, сделай так
Добавлено через 1 минуту Кстати насчёт throw в тернарном операторе: я сам думал что так работать не будет, но mingw скомпилировал всё как положено и при выходе за границы и правда выбрасывается исключение, которое также успешно ловится так что работает всё корректно.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.09.2011, 16:41 | 10 |
Vec4(const Vec4& right)
Mat4(const Vec4 &x)
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
||||||||||||||||||||||||||
27.09.2011, 16:53 [ТС] | 11 | |||||||||||||||||||||||||
И ещё раз по поводу моей ошибки: minigw пишет что нет кандидата на вызов +=
и дальше пишет кандидат 1 += для Vec4 и кандидат 2 для += это float, мне бы надо чтобы вызывался 1ый кандидат так как он вообще-то и подходит по семантике и вроде всё хорошо, но компилятору же что-то не нравится ... Хотя ... ошибка явно где-то в перегрузке в Vec4 - я попробовал в Main проделать следующее:
Добавлено через 1 минуту Deviaphan, тогда это не работает
Ну и все остальные функции где возвращается temp пишут ошибку + не работает и такой вариант:
Хотя последнее это понятно почему, его исправил, но все остальные где возвращается temp теперь не компилируются Добавлено через 46 секунд Ну и вообще оно понятно почему они не работают, конструктор копирования то нельзя теперь не явно вызывать, но как же мне тогда поступать? Добавлено через 5 минут Deviaphan, Вы не поняли, сделав
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
|
27.09.2011, 16:53 | 12 |
Mat4 = Mat4( vec4 + vec4 );
Но сперва сделать все аргументы константными ссылками (коими они и должны были быть изначально). Методы не изменяющие состояние должны быть константными.
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||||||
27.09.2011, 16:58 [ТС] | 13 | ||||||||||
Давайте пока забудем о Mat4, ошибка я вижу не в нём
Допустим имеем Vec4 (изменения насчёт того чтобы возвращалась ссылка на элемент внёс, но теперь компилятор кое-где ругается что мол возвращается ссылка на локальную переменную ...)
0
|
Заблокирован
|
||||||
27.09.2011, 17:09 | 14 | |||||
Gepar,
он отработает и для такого, причём успешно, я сам был пару дней назад чуть мировоззрение не поменял
Добавлено через 3 минуты Не по теме: Gepar, помню недавно писал что именно 6-ка для приёма лаб, так вот ругань компилятора как раз из шестёрки, я без обид хочу чтобы ты понял в случае компилирования твоего кода при сдаче может получиться неприятный сюрприз:pardon:
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
27.09.2011, 17:10 | 15 | |||||
Ты не правильно понял и написал. Я имел в виду по типу такого:
1
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||||||
27.09.2011, 17:31 [ТС] | 17 | ||||||||||
-=ЮрА=-, это не для сдачи, это задание из книги Страуструпа.
Добавлено через 6 минут Deviaphan, Вы не поняли, сделав
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
27.09.2011, 17:33 | 18 | |||||
Можешь!
Это одно и то же. Первое удали.
0
|
1186 / 542 / 78
Регистрация: 01.07.2009
Сообщений: 3,517
|
|||||||||||
27.09.2011, 17:38 [ТС] | 19 | ||||||||||
Если же убрать explicit и сделать всюду как посоветовал Deviaphan то ошибки насчёт возврата локальных переменных исчезнут, а в main где написано
warning: pointer to a function used in arithmetic| А потом уже ошибки
На всякий случай прикрепил Vec4.h + main.cpp в виде архива, возможно так будет удобнее чтобы посмотреть файл в привычном редакторе.
0
|
Делаю внезапно и красиво
1313 / 1228 / 72
Регистрация: 22.03.2011
Сообщений: 3,744
|
||||||
27.09.2011, 18:02 | 20 | |||||
Указатель на функцию используется в арифметическом выражениии...
Добавлено через 7 минут Про explicit для Vec4 я погорячился.) Он там не нужен. Добавлено через 3 минуты "Твою ж мать!"
А std::right это манипулятор, который ты пытаешься использовать, как функцию. Добавлено через 23 секунды Жирненько не получилось выделить.( Добавлено через 44 секунды И у тебя там лишние методы для Vec4, надо почистить. Добавлено через 1 минуту Собственно, нужно просто внимательнее читать сообщение: *(std::right + ((unsigned int)i)) Адрес функции std::right пытается сдвинуться на , чего для адресов функции не предусмотрено. А я ещё понять не мог, чего он такого странного пишет.
0
|
27.09.2011, 18:02 | |
27.09.2011, 18:02 | |
Помогаю со студенческими работами здесь
20
Перегрузка оператора != Перегрузка оператора > перегрузка оператора () Перегрузка оператора *= Искать еще темы с ответами Или воспользуйтесь поиском по форуму: |