![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
имеется вот такая простая программа
Говорят, что в 20-ой строчке нужно обязательно возвращать ссылку на поток, чтобы operator<< можно было использовать в сложных (составных) выражениях. Действительно этот код, с закоментированной 20-ой строчкой с -Wall компилироваться отказывается по понятным причинам. Однако без -Wall поведение программы что с 20-ой строчкой, что без нее -- одинаковое. Но если я не верну ссылку на поток в перегруженной функции, то куда тогда отправится endl в 27 строчке? |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Что значит куда? Туда, куда ему укажут. Функции operator<< возвращает значение допустим в EAX(что справедливо для 32 битных машин аля ix86). Соответственно туда он и отправит. Теперь попрубуем определить, чему он равняется. Разумеется он undefined в общем случае, но нас волнуют частности. В твоей функции есть лишь одна строка:
stream << rhs.x << endl; Как думаешь, чему равняется eax после ее выполнения? Правильно, eax равен stream'у, т.к. stream<<endl возвращает значение. А так как больше твоя функция больше ничего не делает, то eax не меняется и потому эта функция возвращает stream. Надеюсь понятно объяснил Хотя в любом случае, это не оправдание чтобы забивать на return stream; -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
Ага, понятно.
После того как убрал из функции stream << rhs.x << endl; программка как и следовало ожидать свалилась в сегфолт. спасибо. |
|||
|
||||
| yours-tester |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 6.2.2005 Репутация: нет Всего: нет |
Дополнительный вопрос к теме.
Если в этой програмке заменить несколько первых строчек вот так:
то она перестаёт компилироваться, а по моему должна. Не пойму почему? Может кто подскажет? --------------------Configuration: Test - Win32 Debug-------------------- Compiling... test-1.cpp D:\docs\Work\VC++\Test\test-1.cpp(20) : error C2248: 'x' : cannot access private member declared in class 'test' D:\docs\Work\VC++\Test\test-1.cpp(10) : see declaration of 'x' D:\docs\Work\VC++\Test\test-1.cpp(29) : error C2593: 'operator <<' is ambiguous D:\docs\Work\VC++\Test\test-1.cpp(30) : error C2593: 'operator <<' is ambiguous Error executing cl.exe. test-1.obj - 3 error(s), 0 warning(s)[code=cpp] |
|||
|
||||
| versus |
|
|||
![]() Шустрый ![]() Профиль Группа: Участник Сообщений: 69 Регистрация: 8.3.2005 Где: Переславль-Залесс кий Репутация: нет Всего: 3 |
без пол-литр... тьфу-ты, без сурса test-1.cpp тут не разобраться...
>Если в этой програмке заменить несколько первых строчек вот так: Очевидно в программке что-то изменили кроме первых строчек. Чем объяснить ругань на приватную x при доступе к ней из дружественной функции класса? Это сообщение отредактировал(а) versus - 31.5.2005, 18:38 |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
yours-tester
Про дружбу не забыл? -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| yours-tester |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 6.2.2005 Репутация: нет Всего: нет |
Как ни странно про дружбу не забыл.
Текст программы изменился только в первых строчках как указано. |
|||
|
||||
| Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
Хмм. У меня все сработало.
Давай весь код в студию, посмотрим. И еще - что-за компилятор? Это сообщение отредактировал(а) Mayk - 1.6.2005, 08:34 -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
| yours-tester |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 56 Регистрация: 6.2.2005 Репутация: нет Всего: нет |
Вот он.
Компилятор VC++ 6.0 Я раньше с такой проблемой уже сталкивался, но в чём причина так и не понял. А тут гляжу похожий случай. Проверил. Та же проблема. Стоит вместо трёх операторов using std::* применить один using namespace std, как программа перестаёт компилироваться. Если же использовать заголовки из глобального пространства h, то опять всё нормально. |
|||
|
||||
| Alastis |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 251 Регистрация: 15.11.2004 Где: Казахстан, Астана Репутация: 4 Всего: 10 |
вывод - пора переходить на VC 7.1, там все это компилируется без проблем
-------------------- Прости, что я говорю, когда ты меня перебиваешь. |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |