3

我正在创建一个自定义 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: 错误: 'operator<< ((* & f), (*"aa")) << std::endl' main.cpp:21 中的'operator<<' 不匹配: 21:注意:候选人是:main.cpp:13:9:注意:模板Foo&运算符<<(Foo&,U&&)main.cpp:13:9:注意:模板参数推导/替换失败:main.cpp:21: 21:注意:
无法推断模板参数'U'</p>

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

4

2 回答 2

5

由于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.

于 2012-09-08T19:42:12.883 回答
3

请注意,很少需要使用模板方法,也没有很好地使用派生来实现与使用自定义std::ostream的方便初始化不同的目的。要创建新的源或目标以读取或写入,您从. 对于流写入,您通常会覆盖和.std::ostreamstd::streambufstd::streambufstd:;streambuf::overflow()std::streambuf::sync()

于 2012-09-08T22:40:16.320 回答