#include <ctime>
#include <iostream>
#include <sstream>
#include <string>
struct make_string
{
template <typename T>
make_string & operator<<(const T & t)
{
ostr << t;
return *this;
}
operator std::string() const { return ostr.str(); }
std::string str() const { return ostr.str(); }
std::ostringstream ostr;
};
void message(const std::string&) {}
int main()
{
message(make_string() << "1 + 1 = " << 2 << "\n"); // OK
message(make_string() << "1 + 1 = " << 2 << std::endl); // Not OK
// OK
std::ostringstream os;
os << std::endl;
// Not ok.
make_string mk;
mk << std::endl;
}
I2luY2x1ZGUgPGN0aW1lPgojaW5jbHVkZSA8aW9zdHJlYW0+CiNpbmNsdWRlIDxzc3RyZWFtPgojaW5jbHVkZSA8c3RyaW5nPgoKc3RydWN0IG1ha2Vfc3RyaW5nCnsKICAgIHRlbXBsYXRlIDx0eXBlbmFtZSBUPgogICAgbWFrZV9zdHJpbmcgJiBvcGVyYXRvcjw8KGNvbnN0IFQgJiB0KQogICAgewogICAgICAgIG9zdHIgPDwgdDsKICAgICAgICByZXR1cm4gKnRoaXM7CiAgICB9CgogICAgb3BlcmF0b3Igc3RkOjpzdHJpbmcoKSBjb25zdCB7IHJldHVybiBvc3RyLnN0cigpOyB9CgogICAgc3RkOjpzdHJpbmcgc3RyKCkgY29uc3QgeyByZXR1cm4gb3N0ci5zdHIoKTsgfQogICAgCiAgICBzdGQ6Om9zdHJpbmdzdHJlYW0gb3N0cjsKfTsKCgp2b2lkIG1lc3NhZ2UoY29uc3Qgc3RkOjpzdHJpbmcmKSB7fQoKCmludCBtYWluKCkKewogICAgbWVzc2FnZShtYWtlX3N0cmluZygpIDw8ICIxICsgMSA9ICIgPDwgMiA8PCAiXG4iKTsgLy8gT0sKICAgIG1lc3NhZ2UobWFrZV9zdHJpbmcoKSA8PCAiMSArIDEgPSAiIDw8IDIgPDwgc3RkOjplbmRsKTsgLy8gTm90IE9LCiAgICAKICAgIAogICAgLy8gT0sKICAgIHN0ZDo6b3N0cmluZ3N0cmVhbSBvczsKICAgIG9zIDw8IHN0ZDo6ZW5kbDsKICAgIAogICAgLy8gTm90IG9rLgogICAgbWFrZV9zdHJpbmcgbWs7CiAgICBtayA8PCBzdGQ6OmVuZGw7Cn0=
prog.cpp: In function ‘int main()’:
prog.cpp:29: error: no match for ‘operator<<’ in ‘((make_string*)((<anonymous> <unknown operator> {{{0u, {{0u, 0, 0, (std::_Ios_Fmtflags)0u, _S_goodbit, _S_goodbit, 0u, {0u, 0l}, {{0u, 0l}}, 0, 0u, {0u}}, 0u, '\000', false, 0u, 0u, 0u, 0u}}, {{0u, 0u, 0u, 0u, 0u, 0u, 0u, {0u}}, (std::_Ios_Openmode)0u, {{0u}}}, {{0u, 0, 0, (std::_Ios_Fmtflags)0u, _S_goodbit, _S_goodbit, 0u, {0u, 0l}, {{0u, 0l}}, 0, 0u, {0u}}, 0u, '\000', false, 0u, 0u, 0u, 0u}}}), make_string()).make_string::operator<< [with T = char [9]](((const char (&)[9])"1 + 1 = ")))->make_string::operator<< [with T = int](((const int&)((const int*)(&2)))) << std::endl’
prog.cpp:38: error: no match for ‘operator<<’ in ‘mk << std::endl’