LINUX.ORG.RU

`cout.operator<<()` vs `cout << `


0

2
#include <iostream>
using namespace std;

int main(int argc, char **argv) {
        cout << "Hello, world\n";
        cout.operator<<("Hello, world\n");
        return 0;
}
$ ./a.out
Hello, world
0x40090c

Почему cout.operator<< производит отличный от `cout << ` результат (похоже что pointer)? Разве это не один и тот же вызов?


Ответ на: комментарий от indie

Ну нет в class basic_ostream оператора:

__ostream_type& operator<<(const char *__p);

На всяк случай добавляем в /usr/include/c++/4.6.3/ostream этот оператор:

/home/green/src/c2/cout.cpp:5: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(char const*)'

/home/green/src/c2/cout.cpp:6: undefined reference to `std::basic_ostream<char, std::char_traits<char> >::operator<<(char const*)'

collect2: ld returned 1 exit status

Вот и конвертит строку в const void*, что и видим в выводе.

Убираем из ostreem __ostream_type& operator<<(const void* __p) { return _M_insert(__p); }

Видим: $ g++ cout.cpp && ./a.out Hello, world 1

Почему нет, а ф.. знает. А оператор std::ostream& operator<<(std::ostream&, const char*) не при чем тут, мыж явно вызываем member operator;

kdev
()
Ответ на: комментарий от kdev

Сказать то что хотел?

Ясно, что в первом случае вызывается функция std::ostream& operator<<(std::ostream&, const char*), а во втором функция-член std::cout

indie
()
Ответ на: комментарий от tyler19

Пиши std:: руками

Что это меняет?

Мужицкость, что же ещё.

kiverattes ★☆
()
Ответ на: комментарий от Ubuntu1210

Ты дебил что ли? В хелловорлде писать меньше (std:: против using namespace std;), а в нормальном проекте использование директивы using херит всю концепцию пространства имён. Обсасывается в каждой книжке по плюсам на первых страницах, где автор объясняет, почему он использует этот костыль в примерах.

anonymous
()
Ответ на: комментарий от Ubuntu1210

Каникулы не каникулы, но я с этими господами.

Deleted
()
Ответ на: комментарий от anonymous

В хелловорлде писать меньше (std:: против using namespace std;), а в нормальном проекте использование директивы using херит всю концепцию пространства имён.

Ничего оно не херит если его разумно использовать, например не писать в заголовочных файлах. Его вообще можно использовать внутри конкретной ф-ции а не для всего файла.

tyler19
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.