![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| sinoptic |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.9.2009 Репутация: нет Всего: нет |
GCC 4.0, C++
Следующий код не компилируется:
Знатоки С++ не могли бы вы подсказать что тут не правльно? Этот код был написан мной на VC++ 2008 - все прекрасно компилируется и работает. ... а вот GNU C++ ругается Большое спасибо. . . . . . детали реализации операторов (если нужно приведу еще):
|
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
следующий код компилируется
|
|||
|
||||
| sinoptic |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.9.2009 Репутация: нет Всего: нет |
Да компилируется, вы правы и должно компилироваться.
Причину на что ругается GCC я нашел. Проблемы начинаются когда добавляете в объявление класса:
Да, ошибка вылазит в другом месте. ... тут я, признаться, начудил - достаточно просто:
Одно в этой ситуации забавляет - MS VC++ это съел и был доволен. Это сообщение отредактировал(а) sinoptic - 29.9.2009, 10:49 |
||||
|
|||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
sinoptic, создай эти операторы:
Потому что он менее соответствует стандарту, чем GCC Это сообщение отредактировал(а) bsa - 29.9.2009, 12:12 |
||||
|
|||||
| sinoptic |
|
||||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.9.2009 Репутация: нет Всего: нет |
С этим я конечно разобрался: по самому первому случаю - обязательно 'const' в описании аргументов функции надо было ставить.
То то ошибка и выползала: " ...no match for 'operator=' ..." По вашему описанию (и собственно говоря по описанию классических и умных книг) я попытался реализовать оператор + с двумя аргументами К сожалению GCC и здесь меня одернул. На классический пример:
в обоих местах: и объявлении метода в классе и в реализации этого метода - появляется ошибка: error: 'mystring mystring::operator+(const mystring&, const mystring&)' must take either zero or one argument Это меня честно говоря в тупик ставит - почему только один аргумент дозволен?! Попытался я обойтись одним аргументом. К сожалению один аргумент не работет в следующем случае:
При дебаге видно что ход программы заходит в оператор + и все там исполняется корректно, складываюся обе строки, на этом все... Оператор = уже не исполняется, а str1 в окнце концов остается пустым, ни "st1" ни "st2" - как будто только что конструктор исполнился. Такие вот дела, кто то может что-то посоветовать? |
||||
|
|||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
приведи минимальный, законченный кусок кода, иллюстрирующий проблему. чтобы я мог скопировать этот код, нажать кнопочку Build и посмотреть на ошибки.
у меня ошибки нет. Это сообщение отредактировал(а) zim22 - 29.9.2009, 20:49 |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
sinoptic, в своем примере я специально указал, какие функции ДОЛЖНЫ быть методами (mystring::), а какие НЕТ. А ты все пытался сделать методами.
Это сообщение отредактировал(а) bsa - 29.9.2009, 20:54 |
|||
|
||||
| sinoptic |
|
|||
|
Новичок Профиль Группа: Участник Сообщений: 7 Регистрация: 28.9.2009 Репутация: нет Всего: нет |
Да, теперь заметил. Оператор с двумя аргументами нужно определять вне класса. Все компилируется и работает теперь! Огромное СПАСИБО! Теперь у меня в голове все встало на место. |
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
можно и внутри класса определить |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 6 Всего: 33 |
Не провоцируй человека на новые вопросы -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
Нельзя. Или с одним аргументом, или вне класса. Вариант с методом класса не будет работать в случае str1 = "asb" + str2, а в случае внешней функции будет, догадайся почему?
|
|||
|
||||
| zim22 |
|
|||
|
depict1 ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2682 Регистрация: 15.1.2009 Где: Украина Репутация: 24 Всего: 69 |
bsa, под оператором с двумя аргументами я подразумевал бинарный оператор. ничто не мешает определить его внутри класса. другое дело, что левый операнд всегда будет типа класса и только один параметр (что аналогично двум параметрам для бинарных операторов определённых вне класса)
Это сообщение отредактировал(а) zim22 - 30.9.2009, 14:07 |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |