我可能做错了什么。有人可以向我解释究竟是什么?
在SemanticNodeFactory类的某处,我有:
std::pair<C_ptr,R_ptr> Find( Token token )
{
C_ptr concept = nullptr;
R_ptr relation = nullptr;
//concept = concept_map->Find( token ); <- This works
//relation = relation_map->Find( token ); <- And this too
std::thread t1 ( [&concept,this] ( Token token ) { concept = concept_map->Find( token ); } );
std::thread t2 ( [&relation,this] ( Token token ) { relation = relation_map->Find( token ); } );
被调用的实际方法属于:
typedef std::shared_ptr<Relation> R_ptr;
typedef std::shared_ptr<Concept> C_ptr;
std::shared_ptr<SemanticGraph<Relation>> relation_map;
std::shared_ptr<SemanticGraph<Concept>> concept_map;
然而,编译器抱怨说:
error: no match for call to ‘(SemanticNodeFactory::Find(Token)::<lambda(Token)>) ()’
note: candidate is:
note: SemanticNodeFactory::Find(Token)::<lambda(Token)>
但是,我试图调用的实际方法实际上是:
SemanticGraph<Relation>::Find(Token)
SemanticGraph<Concept>::Find(Token)
我做错了什么? 我通过引用捕获了这个局部变量,但它似乎抱怨实际的方法?
答案 0 :(得分:3)
你给std::thread
一个带有一个参数的函数对象 - 但是你没有给它任何参数来传递这个参数。你应该做
thread t1([...] () {...});
并抓取token
,或者
thread t1([...] (Token) {...}, token);
并明确传递。
答案 1 :(得分:1)
这个问题与lambda函数无关!相反,std::thread
期望一个函数除了函数之外还采用您选择传递的参数。由于lambda函数采用参数(a Token
),你也需要传递该参数,例如:
std::thread t1 ( [&concept,this] ( Token token ) { concept = concept_map->Find( token ); },
token );
std::thread t2 ( [&relation,this, token] () { relation = relation_map->Find( token ); } );
对于第一个示例,要传递给被调用函数的token
作为第二个参数传递给std::thread
的构造函数。对于第二个示例,函数token
的参数Find()
在capture子句中显式使用。
请注意,如果std::thread
超出范围而未调用join()
或detect()
,则会导致该程序为std::terminate()
d。因此,请确保调用这些功能中的任何一个。防止异常的最安全方法是使用合适的类封装std::thread
对象,其析构函数使用适当的操作(即join()
;使用detach()
似乎是灾难邀请)。