为什么我自己的输出流类不起作用?

时间:2013-02-05 23:13:52

标签: c++ class stream iostream template-function

  

可能重复:
  std::endl is of unknown type when overloading operator<<

#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:二进制'&lt;&lt;' :'OutputStream'未定义此运算符或转换为预定义运算符

可接受的类型

1 个答案:

答案 0 :(得分: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;
}