C++ C++;11λ函数赢得';不接受类方法

C++ C++;11λ函数赢得';不接受类方法,c++,c++11,lambda,C++,C++11,Lambda,我可能做错了什么。有人能给我解释一下到底是什么吗 在Semanticodefactory类的某个地方,我有: std::pair<C_ptr,R_ptr> Find( Token token ) { C_ptr concept = nullptr; R_ptr relation = nullptr; //concept = concept_map->Find( token ); <- This works

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

在Semanticodefactory类的某个地方,我有:

    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 ); } );
std::配对查找(令牌)
{
C_ptr concept=nullptr;
R_ptr关系=nullptr;
//概念=概念映射->查找(令牌);查找(令牌);查找(令牌);};
线程t2([&relation,this](令牌令牌){relation=relation\u map->Find(令牌);});
正在调用的实际方法属于:

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;
typedef std::shared_ptr_ptr;
typedef std::共享_ptr C_ptr;
std::共享关系图;
std::共享概念图;
但是,编译器抱怨:

error: no match for call to ‘(SemanticNodeFactory::Find(Token)::<lambda(Token)>) ()’
note: candidate is:
note: SemanticNodeFactory::Find(Token)::<lambda(Token)>
错误:对“(SemanticNodeFactory::Find(Token)::)()”的调用不匹配
注:候选人为:
注意:语义定义::查找(标记)::
然而,我试图调用的实际方法实际上是:

SemanticGraph<Relation>::Find(Token)
SemanticGraph<Concept>::Find(Token)
语义图::查找(令牌) SemanticGraph::查找(令牌) 我做错了什么?
我通过引用捕获了这个局部变量,但它似乎对实际的方法表示不满?

您给了
std::thread
一个函数对象一个参数,但是您没有给它任何参数来传递这个参数。你要么

thread t1([...] () {...});
并捕获
令牌
,或者

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

然后显式地传递它。

您给
std::thread
一个函数对象一个参数,但是您没有给它任何参数来传递这个参数。你要么

thread t1([...] () {...});
并捕获
令牌
,或者

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

并显式传递。

问题与lambda函数无关!相反,
std::thread
期望函数除了传递函数外,还包含您选择传递的尽可能多的参数。由于lambda函数具有参数(一个
标记
),因此也需要传递该参数,例如:

std::thread t1 ( [&concept,this] ( Token token ) { concept = concept_map->Find( token ); },
                 token );
std::thread t2 ( [&relation,this, token] () { relation = relation_map->Find( token ); } );
对于第一个示例,要传递给被调用函数的
标记
作为第二个参数传递给
std::thread
的构造函数。对于第二个示例,函数
Find()
的参数
token
在capture子句中显式使用


请注意,如果
std::thread
未调用
join()
detect()
而超出范围,则程序将被
std::terminate()
d。因此,请确保调用了这两个函数中的任何一个。防止异常的最安全的方法是使用合适的类封装
std::thread
对象,该类的析构函数使用合适的操作(即
join()
;使用
detach()
似乎是灾难的诱因)。

问题与lambda函数无关!相反,
std::thread
期望函数除了传递函数外,还包含您选择传递的尽可能多的参数。由于lambda函数具有参数(一个
标记
),因此也需要传递该参数,例如:

std::thread t1 ( [&concept,this] ( Token token ) { concept = concept_map->Find( token ); },
                 token );
std::thread t2 ( [&relation,this, token] () { relation = relation_map->Find( token ); } );
对于第一个示例,要传递给被调用函数的
标记
作为第二个参数传递给
std::thread
的构造函数。对于第二个示例,函数
Find()
的参数
token
在capture子句中显式使用

请注意,如果
std::thread
未调用
join()
detect()
而超出范围,则程序将被
std::terminate()
d。因此,请确保调用了这两个函数中的任何一个。防止异常的最安全的方法是使用合适的类封装
std::thread
对象,该类的析构函数使用合适的操作(即
join()
;使用
detach()
似乎会招致灾难)