此问题可能与Why does passing object reference arguments to thread function fails to compile?有关。将参数传递给线程函数(模板化)
但是,我遇到了类似的问题,在我的情况下,仿函数是一个模板。
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"'
我怎样才能解决这个问题?
由于线程使用参数打印的东西,它似乎隐含地假设参数是一个ostream。这里真的需要一个模板吗? – jogojapan
@jogojapan:我试图把它作为一个函数模板的原因是我需要也使用boost中的一些ostreams。升压/ iostreams和升压/文件系统。阅读你的评论后,我试图通过boost :: filesystem :: ofstream与非模板版本,它的作品!但我不确定它是否适用于所有其他ostreams。 – Sungmin
它适用于从'std :: ostream'开始的任何事情。对于输出流,从'std :: ostream'派生是一个好主意,除非你已经知道你想使用的类型不是来自'std :: ostream',否则我会,如果我是你,假设采用'std :: ostream&'参数就足够了。 – jogojapan