次のスニペットで簡単に公開されているカスタム 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<<' の 'operator<<' に一致しません ((* & f), (*"aa")) << std::endl' main.cpp:21: 21: 注: 候補は次のとおりです: main.cpp:13:9: 注: テンプレート Foo& 演算子 <<(Foo&, U&&) main.cpp:13:9: 注: テンプレート引数の控除/置換に失敗しました: main.cpp:21: 21: 注:
テンプレート パラメータ 'U' を推測できませんでした</p>
パラメータ U を推定できないのはなぜですか? これはいけませんtypeof(std::endl)
か?