Возможный дубликат:
std :: endl имеет неизвестный тип при перегрузке оператора<<
#include <iostream>
using namespace std;
struct OutputStream
{
template<class T>
OutputStream& operator <<(const T& obj)
{
cout << obj;
return *this;
}
};
OutputStream os;
int main()
{
os << 3.14159 << endl; // Compilation Failure!
}
Компилятор VC ++ 2012 жалуется:
ошибка C2676: двоичная<<‘:’ OutputStream ‘не определяет этот оператор или преобразование в тип, приемлемый для предопределенного оператора
Причина в том, что компилятор не может определить тип T
, так как std::endl
шаблон функции, определенный как
template <class charT, class traits>
basic_ostream<charT,traits>& endl ( basic_ostream<charT,traits>& os );
Способ преодолеть это в IOStreams заключается в предоставлении соответствующей перегрузки operator<<
:
OutputStream& operator <<(std::ostream& ( *pf )(std::ostream&))
{
cout << pf;
return *this;
}
Других решений пока нет …