이 질문은 Why does passing object reference arguments to thread function fails to compile?과 관련이있을 수 있습니다.스레드 함수에 인수 전달 (템플릿)
필자와 비슷한 문제가 생겼다. 필자의 경우 functor가 템플릿이다.
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"'
가 어떻게이 문제를 해결할 수
?
스레드가 인수를 사용하여 무언가를 인쇄하기 때문에 인수가 암시 적으로 인수로 가정합니다. 여기에 템플릿이 정말로 필요합니까? – jogojapan
@ jogojapan :이 템플릿을 함수 템플릿으로 만들려고 한 이유는 boost에서 ostream을 사용해야하기 때문입니다. 부스트/iostreams 및 부스트/파일 시스템. 귀하의 의견을 읽은 후, 나는 boost :: filesystem :: ofstream을 템플릿이 아닌 버전과 함께 전달하려고 시도했으며 작동합니다 !!. 그러나 다른 모든 ostreams에서도 작동하는지 확신 할 수 없습니다. – Sungmin
'std :: ostream'에서 _derived_ 인 모든 것을 처리 할 것입니다. 출력 스트림의 경우에는'std :: ostream'에서 파생시키는 것이 좋습니다. 사용하려는 스트림 유형이'std :: ostream'에서 파생되지 않은 경우를 제외하고는, 내가 너라면,'std :: ostream &'인수를 취하는 것으로 충분하다고 가정한다. – jogojapan