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<<' の '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)か?

4

2 に答える 2

3

std::ostreamテンプレート アプローチを使用する必要はめったにないことに注意してstd::ostreamくださいstd::streambuf。読み取りまたは書き込みを行う新しいソースまたはターゲットを作成するには、std::streambuf. ストリーム書き込みの場合、通常は と を上書きstd:;streambuf::overflow()std::streambuf::sync()ます。

于 2012-09-08T22:40:16.320 に答える