After looking at the ostream::operator << c++ reference,
I noticed the following declarations:
ostream& operator<< (bool val); ostream& operator<< (short val); ostream& operator<< (unsigned short val); ostream& operator<< (int val); ostream& operator<< (unsigned int val); ostream& operator<< (long val); ostream& operator<< (unsigned long val); ostream& operator<< (float val); ostream& operator<< (double val); ostream& operator<< (long double val); ostream& operator<< (void* val); ostream& operator<< (streambuf* sb ); ostream& operator<< (ostream& (*pf)(ostream&)); ostream& operator<< (ios& (*pf)(ios&)); ostream& operator<< (ios_base& (*pf)(ios_base&)); But then I found out that there are also the following declarations:
ostream& operator<< (ostream& os, char c); ostream& operator<< (ostream& os, signed char c); ostream& operator<< (ostream& os, unsigned char c); ostream& operator<< (ostream& os, const char* s); ostream& operator<< (ostream& os, const signed char* s); ostream& operator<< (ostream& os, const unsigned char* s); Why are the char/string output operators not member functions?