如何在自定义std :: ostream类中使用std :: endl

时间:2012-09-08 19:38:09

标签: c++ templates std

我正在创建一个自定义的ostream类,它在以下代码片段中简要公开。我希望能够使用std::endl,但编译器不允许我。我不明白为什么。

#include <iostream> 

struct Bar
{
};

template <typename T>
struct Foo
{
};

template <typename T, typename U>
Foo<T>& operator<<(Foo<T>& _foo, U&&)
{
  return _foo;
}

int main()
{
  Foo<Bar> f;
  f << "aa" << std::endl;
}

gcc 4.7.1给出的错误是:

  

main.cpp:21:21:错误:'运营商&lt;&lt;&lt;&lt;&lt;&lt;&lt;&lt; ((*&amp; f),(*“aa”))&lt;&lt; std :: endl'main.cpp:21:21:   注意:考生是:main.cpp:13:9:注意:模板   美孚和放大器;运算符&lt;&lt;(Foo&amp;,U&amp;&amp;)main.cpp:13:9:注意:模板   论证扣除/替换失败:main.cpp:21:21:注意:
  无法推断模板参数'U'

为什么不能推断出参数U?这不应该是typeof(std::endl)吗?

2 个答案:

答案 0 :(得分:4)

由于std::endl

namespace std {
template <class charT, class traits>
basic_ostream<charT,traits>& endl(basic_ostream<charT,traits>& os);
}

您的课程不是来自basic_ostream,因此无法使用。

basic_ostream

basic_ostream<charT,traits>& operator<<
(basic_ostream<charT,traits>& (*pf)(basic_ostream<charT,traits>&))

适用于std::endl等操纵符。

答案 1 :(得分:2)

请注意,很少需要使用模板方法,也不能很好地使用从std::ostream派生用于不同的目的,而不是使用自定义{{1}方便地初始化std::ostream }}。要创建要读取或写入的新源或目标,可以从std::streambuf派生。对于信息流撰写,您通常会覆盖std::streambufstd:;streambuf::overflow()