![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
давно юзаю дружественные функции, но возникла проблема
вот очень простой пример
компилятор посылает меня куда то в тех поддержку: Compiling... main.cpp E:\Zad\fraction\main.cpp(25) : fatal error C1001: INTERNAL COMPILER ERROR (compiler file 'msc1.cpp', line 1786) Please choose the Technical Support command on the Visual C++ Help menu, or open the Technical Support help file for more information Error executing cl.exe. fraction.exe - 1 error(s), 0 warning(s) А если поменять знак '+', например, на знак '*' в объявлении, определении функции и в майне, то всё зароботает. В чём проблема? уже перегружал дружественной функцией оператор '+', но такого типа ошибка впервые. |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
прежде всего напрашивается вопрос, а где копи-конструктор ?
![]() если это: Fraction(Fraction& c) то там не хватает квалификатора const ![]() Это сообщение отредактировал(а) mes - 29.5.2009, 23:17 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
а это что? ![]() Luyan 1. Какая версия студии? 2. попробуйте перезапустить компилятор 3. попробуйте создать проект снова сам код - с точки зрения С++ нормальный. А вообще - не очень грамотно написан. Это сообщение отредактировал(а) azesmcar - 29.5.2009, 19:35 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
это конструктор по ссылке ![]() Это сообщение отредактировал(а) mes - 29.5.2009, 23:17 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
вы имеете ввиду что ссылка неконстантная?? это конечно странно в данном контексте, но вполне законно..и это считается копи-конструктором. Для примера - копи конструктор std::auto_ptr принимает неконстантную ссылку. Это сообщение отредактировал(а) azesmcar - 29.5.2009, 19:36 |
|||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
а теперь посмотрите, что получается при прибавлении в таком случае - ссылка на временный объект ![]() Добавлено @ 19:41
у std::auto_ptr нет копи-конструктора, и именно это является причиной, почему компилятор отказывается помещать в std::контейнер. у std::auto_ptr нет константного копи-конструктора, и именно это является причиной, почему компилятор отказывается помещать в std::контейнер. ![]() Это сообщение отредактировал(а) mes - 29.5.2009, 23:16 |
||||
|
|||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
1. Microsoft Visual C++ 6.0 2. Перезапускал 3. Пересоздавал проект Ничего нового не произошло. главное не понятно, в других проектах перегруженный дружественной функцией operator+ работает ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
поставьте все таки const и проверьте еще раз ![]() |
|||
|
||||
zim22 |
|
|||
![]() depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 29 Всего: 69 |
Это сообщение отредактировал(а) zim22 - 29.5.2009, 19:51 |
|||
|
||||
azesmcar |
|
||||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Не совсем понял о чем речь.
и как тогда работает вот это?
источник всех бед ![]() что вы нормальный компилятор то не скачаете? INTERNAL COMPILER ERROR - внутреняя ошибка, либо вы написали что-то, чем сильно смутили компилятор, либо у него просто критические дни. Может быть и то и другое, критические дни у смущенного компилятора - это слишком. Это сообщение отредактировал(а) azesmcar - 29.5.2009, 20:00 |
||||||||||
|
|||||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Посмотрел в стандарт, действительно и то и другое (с константной ссылкой и с простой) называется copy-constructor. Признаю ошибку.
Однако это не отменяет того, что при данной схеме должен быть "константный" копи--конструктор. |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
то что получается следующее
и ни один нормальный компилятор такое не откомпилирует. |
||||
|
|||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Вообще конструктор копирования НАДО писать по возможности константным. Один неконстантный конструктор копирования за собой цепочку потащит.
Добавлено через 1 минуту и 51 секунду Уже интереснее ![]() 1. Я честно говоря весь код не смотрел 2. Мой "ненормальный откомпилировал" без единого варнинга ![]() сейчас загляну в код, что же там такое написано |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Luyan,ловите исправленый вариант :
Это сообщение отредактировал(а) mes - 29.5.2009, 20:10 |
|||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
mes не работает ваш вариат, та же ошибка
может написать методы присваивания значений и юзать их в функции? например
Это сообщение отредактировал(а) Luyan - 29.5.2009, 20:21 |
|||
|
||||
azesmcar |
|
||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
mes
немного изменил код, сократил чтобы глаза не разбегались.
немного изменим вызов оператора
в чем тут проблема, я не совсем понял.. передаем в оператор два обьекта по значению. т.е. вызывается конструктор копирования для класса Fraction, далее возвращает значение по значению. Это сообщение отредактировал(а) azesmcar - 29.5.2009, 20:24 |
||||
|
|||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Это сообщение отредактировал(а) mes - 29.5.2009, 20:26 |
||||
|
|||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Добавлено через 19 секунд Вывел
Добавлено через 1 минуту и 26 секунд Прошу прощения... а
зачем это тут нужно? |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
попала в результате копи паста из другого примера ![]() |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
mes
А давайте все таки мой пример анализировать, он как-то более читабелен ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Давайте ... свой пример я привел, чтоб убедиться в поведении VS. И судя по результату, она в которой раз проявила себя с дружественной к пользователю стороны, переступая через стандарт. ![]() только я думаю для этого надо начать другую тему,чтоб не мешать тс разобраться со своей проблемой. Это сообщение отредактировал(а) mes - 29.5.2009, 20:48 |
|||
|
||||
azesmcar |
|
||||||||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
mes
Visual Studio 2008 Выдает должную ошибку
заменяем int на какой нибудь класс
Добавлено через 55 секунд оптимизатор я отключил чтобы исключить инлайнинг и тому подобное... |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Luyan, сократил пример до минимума,
это тоже дает ошибку ?
|
|||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
нет, этот работает Так что же мне изменить, чтобы в изначальном примере заработало? и объясните, пожалуйста, почему всё работает с '*'('/') ![]() Это сообщение отредактировал(а) Luyan - 29.5.2009, 21:03 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
тогда попробуйте еще раз так :
azesmcar, прошу Вас сюда пожаловать: http://forum.vingrad.ru/forum/act-ST/f-471...9/unread-1.html чтоб смогли продолжить изучить вопрос возникший по отношению к VS Это сообщение отредактировал(а) mes - 29.5.2009, 21:17 |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
обсуждение переехало
![]() Добавлено через 10 минут и 36 секунд Luyan не надо себя мучать, скачайте нормальный компилятор. Шестую студию еще до Ноя создали, он ее на ковчег с собой брал чтобы не скучать в дороге. Это сообщение отредактировал(а) azesmcar - 29.5.2009, 21:32 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
mes, попробывал, всё равно эта ошибка придётся качать VS 2008, кажется проблема решиться только так ![]() Это сообщение отредактировал(а) Luyan - 29.5.2009, 21:37 |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну тогда остается искать методом научного тыка
![]() с закоментированными строками 24; 29; 30; у последнего примера опять ошибка ? |
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
Luyan
По моему если вы там только int main() оставите он все равно будет ее выдавать, у вас проблема с самим компилятором..если создание нового проекта не помогает, его надо переинсталировать что ли..а вообще - правильно было бы поменять |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
этот код http://forum.vingrad.ru/index.php?showtopi...t&p=1882413 ошибки не дает. ![]() |
|||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
||||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
вот
![]()
во всех других проектах класс был в заголовочном файле, а std - страшное зло ![]() |
|||
|
||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
вместе с main () ?! а также получается , что когда Вам отдельные тестовые примеры давали, Вы их в общий проект пристыковывали ?! ![]() Добавлено через 1 минуту и 31 секунду вижу что делать const& в конструкторе и операторе не хотите .. чтож Ваше право ![]() |
|||
|
||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
нет, это про другие проекты, которые здесь не озвучивались как я понял, грамотно с const надо сделать так
|
|||
|
||||
azesmcar |
|
|||
![]() uploading... ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 6291 Регистрация: 12.11.2004 Где: Армения Репутация: 52 Всего: 211 |
||||
|
||||
mes |
|
||||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 3 минуты и 2 секунды мне кажется не помешало бы подобрать другие названия букв, семантически более осмысленные. Добавлено через 3 минуты и 54 секунды также как и для SetA GetA ... |
||||
|
|||||
Luyan |
|
|||
Бывалый ![]() Профиль Группа: Участник Сообщений: 180 Регистрация: 3.12.2008 Репутация: 2 Всего: 7 |
проблема решилась скачкой MVS 2008 Standard Edition
![]() хотя и на старом компиляторе всё уже работало ![]() вопрос снят, всем кто помогал спаибо! ![]() |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |