Почему оператор ввода - это адрес печати вместо строки?
У меня есть простые строки кода, где я использую оператор ввода <<
, чтобы показать hello world string. Если я использую оператор b, то это должно привести к a.operator(b);
Я пытаюсь сделать то же самое с оператором вставки, а на выходе я получил адрес строки, а не фактическую строку.
std::cout<<"Hello world"<<std::endl;
std::cout.operator<<("Hello world").operator<<(std::endl);
Вывод:
Привет мир
0120CC74
Я использую Visual Studio.
Есть ли у меня проблемы с преобразованием оператора?
Ответы
Ответ 1
std::cout<<"Hello world"<<std::endl;
использовать перегруженный оператор вывода для const char*
, то есть свободную функцию, а не функцию-член.
std::cout.operator<<("Hello world").operator<<(std::endl);
использовать перегруженный оператор вывода для const void*
, так как const char*
неявно конвертируется в const void*
.
Здесь вы можете посмотреть перегрузки участников здесь и бесплатные перегрузки
Ответ 2
Моя ставка заключается в том, что оператор-функция-член для std::ostream(char*)
не перегружен.
Если вы посмотрите на ostream:: operator < <, void*
наилучшее совпадение и char*
, естественно, преобразуется в него, в то время как глобальный operator < (std:: basic_ostream) имеет точные перегрузки для типов char*
, которые получают.
Конечно, они ведут себя по-другому.
Ответ 3
Как говорят другие ответы, проблема в том, что вы явно вызываете функцию-член operator <<
, которая не перегружена для const char*
.
Чтобы получить перегрузку const char*
, вам нужно вызвать бесплатную функцию operator <<
, которая должным образом перегружена:
operator<<(std::cout, "Hello World").operator<<(std::endl);
Аналогично, нет никакой свободной функции перегрузки operator <<
для записи std::ostream& (*)(std::ostream&)
, поэтому для std::endl
вам нужно использовать функцию-член.
Из этого можно видеть, что вы не можете переписать из синтаксиса оператора infix (std::cout << ...
) функцию синтаксиса вызова (operator << (...)
) без потери общности.