4

この質問は、オブジェクト参照引数をスレッド関数に渡すとコンパイルに失敗するのはなぜですか? .

同様の問題が発生しましたが、私の場合、ファンクターはテンプレートです。

class A {
public:
  // Non template version works as expected!!.
  // void operator()(std::ostream& out){
  //    out << "hi\n";
  // }

  // template version doesn't. 
    template <class Ostream>
    void operator()(Ostream& out){
        out << "hi\n";
    }

};

int main() {
   A a;
   thread t(a, ref(cout));
   t.join();
}

GCC 言います:

error: no match for 'operator<<' in 'out << "hi\012"'

どうすればこの問題を解決できますか?

4

1 に答える 1

3

を渡していstd::reference_wrapperます。したがって、のタイプは、エラーを説明するものになりますclass Ostreamstd::reference_wrapper

template <class OstreamRef>
void operator()(OstreamRef& outRef){
    outRef.get()<< "hi\n";
}

これで修正されるはずです。

非テンプレートの場合、 に変換する必要がある場合、std::ostream&get()暗黙的に呼び出されます。ただし、テンプレートでは他の型に変換する必要がないため、std::reference_wrapperはそのまま渡されるため、 を明示的に呼び出す必要がありますget()。ありがとう @jogojapan

于 2012-12-26T03:39:15.657 に答える