1

我可能做错了什么。有人可以向我解释一下到底是什么吗?

在 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)

我究竟做错了什么?我通过引用捕获了这个局部变量,但它似乎抱怨实际的方法?

4

2 回答 2

3

你给std::thread一个函数对象接受一个参数 - 但你没有给它任何参数来传递这个参数。你应该做

thread t1([...] () {...});

并且token被抓获,或者做

thread t1([...] (Token) {...}, token);

并明确传递。

于 2013-10-25T01:48:02.040 回答
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()在捕获子句中显式使用。

请注意,如果 astd::thread超出范围而没有调用任何一个,join()或者detect()将导致程序为std::terminate()d。因此,请确保调用这些函数中的任何一个。防止异常的最安全方法是std::thread用适当的类封装对象,该类的析构函数使用适当的操作(即,join()使用detach()似乎是灾难的邀请)。

于 2013-10-25T01:49:35.527 回答