1

可能重复:
重载 operator<< 时 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”未定义此运算符或转换为预定义运算符可接受的类型

4

1 回答 1

4

原因是编译器无法推断出 的类型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;
}
于 2013-02-05T23:23:18.893 回答