2015-10-30 104 views
2

我正在使用一個Visual Studio項目(v120編譯器),它使用std ::線程從GUI除了從USB設備讀取,並且該函數會引發錯誤:「Error C2661「的std ::螺紋::線程」:這裏沒有重載函數接受3個參數」std ::線程初始化構造函數給出編譯錯誤

代碼:

class IOThread 
{ 
public: 
IOThread(DeviceHandler *handle) : _handle(handle) 
~IOThread(); 

std::thread *getThread(ThreadType type); 

template <typename T> 
void execRead(std::list<T> *dataStack) 
{ 
    std::thread *thread = getThread(Read); 

    if (thread == NULL) 
    { 
     thread = new std::thread(&DeviceHandler::readFromBus, _handle, dataStack); 
     _threadPool.push_back(std::make_pair(Read, thread)); 
    } 
} 

private: 
DeviceHandler          *_handle; 
std::vector<std::pair<ThreadType, std::thread *>> _threadPool; 
}; 

而且,DeviceHandler是一個抽象類,它定義了純虛readFromBus功能,它的原型是以下

template <typename T> 
void readFromBus(std::list<T> *dataStack) = 0; 

我希望你不要有相同的頭痛,因爲我做的,而解決這個爛攤子...... 問候,

+0

您是否故意切斷ctor機體? – Glapa

+0

您使用的是什麼版本的MSVS? 'DeviceHandler :: readFromBus'的簽名是什麼? – NathanOliver

+0

@NathanOliver他正在通過'_handle' ... –

回答

0

我試着給錯誤的MVCE,但如果它編譯我無法測試; 但這裏的類的實際結構使用你的施法

thread = new std::thread(
static_cast<void (DeviceHandler::*)(std::list<T> *)>(&DeviceHandler::readFromBus), 
_handle, dataStack); 

http://ideone.com/gVh1Du

編輯:我解決了這個問題,這個問題是模板純粹的定義,這是我通過發生在參數抽象函數代替結構如下

typedef struct s_dataStack 
{ 
    DataType type; 
    std::list<void *> stack; 
} t_dataStack; 

,然後我枚舉「數據類型」施放任何堆元件與設置類型。 感謝您給予的幫助,它將我引向問題的根源。

2

正如評論解釋你的情況是一樣的是this question。因爲方法DeviceHandler::readFromBus()是任意模板化的,可以生成許多過載。 (他們分享名字,但簽名不同)。

因此,編譯器無法選擇正確的重載,因此出現錯誤消息。您需要告訴編譯器哪個超載可以使用。 (如this answer解釋)

下投應該做的:

thread = new std::thread(
    static_cast<void (DeviceHandler::*)(std::list<T> *)>(&DeviceHandler::readFromBus), 
    _handle, dataStack); 
+0

不錯的解決方法! 它實際上編譯,但現在語法錯誤拋出readFromBus原型..「錯誤\t C2059 \t語法錯誤:'常'' – stalker2106

+0

如果語法錯了,它不會編譯,我不明白。 我創建了一個類似於[cast the works](http://ideone.com/NLLomy)的情形。 –

+0

我想我們的兩個環境不同, 我實際上啓動一個線程到一個成員函數,而在你的情況下,它實際上是一個調用線程的基本func。 你實際上也使用綁定,我不知道它的行爲和它暗示的用法..我會檢查參考備忘單。 此外,我看不到純原型上的任何常量聲明,是嗎? – stalker2106