我正在创建一个自定义的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)
吗?
答案 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::streambuf
和std:;streambuf::overflow()
。