2013-10-25 41 views
1

我可能做錯了什麼。有人能向我解釋究竟是什麼?C++ 11 lambda函數將不接受類方法

某處類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) 

我在做什麼錯? 我通過引用捕獲這個局部變量,但它似乎抱怨實際的方法?

回答

3

你給std::thread函數對象帶一個參數 - 但是你不給它任何參數來傳遞這個參數。您應該做的

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

,並有token被捕獲,或做

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

,並明確通過。

+0

謝謝,就是這樣,我甚至沒有注意線程值... –

1

該問題與lambda函數無關!相反,std::thread需要一個函數,除了函數外,還可以選擇多個參數。既然你lambda函數取參數(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()

請注意,std::thread超出範圍而未調用join()detect()將導致程序爲std::terminate() d。因此,請確保您調用這些功能中的任何一個。防範異常的最安全方法是將std::thread對象封裝爲一個合適的類,該類的析構函數使用適當的操作(即,join();使用detach()似乎是對災難的邀請)。