Для начала самое простое решение - получить список возможных перегрузок, которые компилятор рассмотрел, например, пытается это:
X x;
std::cout << x << "\n";
, где X
- этовведите без какой-либо перегрузки для потоковой передачи, что приводит к следующему списку возможных перегрузок:
prog.cpp: In function ‘int main()’:
prog.cpp:21: error: no match for ‘operator<<’ in ‘std::cout << x’
include/ostream:112: note: candidates are: std::ostream& std::ostream::operator<<(std::ostream& (*)(std::ostream&))
include/ostream:121: note: std::ostream& std::ostream::operator<<(std::basic_ios<_CharT, _Traits>& (*)(std::basic_ios<_CharT, _Traits>&))
include/ostream:131: note: std::ostream& std::ostream::operator<<(std::ios_base& (*)(std::ios_base&))
include/ostream:169: note: std::ostream& std::ostream::operator<<(long int)
include/ostream:173: note: std::ostream& std::ostream::operator<<(long unsigned int)
include/ostream:177: note: std::ostream& std::ostream::operator<<(bool)
include/bits/ostream.tcc:97: note: std::ostream& std::ostream::operator<<(short int)
include/ostream:184: note: std::ostream& std::ostream::operator<<(short unsigned int)
include/bits/ostream.tcc:111: note: std::ostream& std::ostream::operator<<(int)
include/ostream:195: note: std::ostream& std::ostream::operator<<(unsigned int)
include/ostream:204: note: std::ostream& std::ostream::operator<<(long long int)
include/ostream:208: note: std::ostream& std::ostream::operator<<(long long unsigned int)
include/ostream:213: note: std::ostream& std::ostream::operator<<(double)
include/ostream:217: note: std::ostream& std::ostream::operator<<(float)
include/ostream:225: note: std::ostream& std::ostream::operator<<(long double)
include/ostream:229: note: std::ostream& std::ostream::operator<<(const void*)
include/bits/ostream.tcc:125: note: std::ostream& std::ostream::operator<<(std::basic_streambuf<_CharT, _Traits>*)
При первом сканировании этого списка мы можем заметить, что char const*
явно отсутствует, и поэтому логично, что void const*
будетвместо этого выбирается адрес, и поэтому печатается адрес.
На второй взгляд мы отмечаем, что все перегрузки методы , и что здесь не появляется ни одной свободной функции.
Эта проблема связана с привязкой ссылок: поскольку временный объект не может связываться со ссылкой на неконстантные, перегрузки формы std::ostream& operator<<(std::ostream&,X)
полностью отклоняются и остаются только функции-члены.
Это так, насколькоМеня беспокоит ошибка проектирования в C ++, после всего того, что мы временно выполняем функцию-мутант, и для этого требуется (скрытая) ссылка на object: x
Обходной путь, как только вы поняли, что пошло не так, относительно проста и требует только небольшую оболочку:
struct Streamliner {
template <typename T>
Streamliner& operator<<(T const& t) {
_stream << t;
return *this;
}
std::string str() const { return _stream.str(); }
std::ostringstream _stream;
};
std::cout << "Inline, take 2: " << (Streamliner() << "some data").str() << "\n";
, которая печатает ожидаемый результат.