2010-10-31 71 views
3

我想在單獨的線程上運行模板函數,但IntelliSense(VC++ 2010 Express)不斷給我提供錯誤: 「錯誤:沒有構造函數的實例」boost :: thread ::螺紋 「參數列表匹配」,如果我嘗試編譯我得到這個錯誤: ‘錯誤C2661:‘提高::螺紋::線程’:沒有重載函數有5個參數’boost ::線程和模板函數

只發生錯誤因爲我添加了模板,所以我確定它與它們有關,但我不知道是什麼。

的我傳遞來提高::線程的兩個參數是模板函數定義爲:

template<class F> 
void perform_test(int* current, int num_tests, F func, std::vector<std::pair<int, int>>* results); 

和:

namespace Sort 
{ 

template<class RandomAccessIterator> 
void quick(RandomAccessIterator begin, RandomAccessIterator end); 

} //namespace Sort 

我打電話的boost ::線程像這樣:

std::vector<std::pair<int, int>> quick_results; 
int current = 0, num_tests = 30; 
boost::thread test_thread(perform_test, &current, num_tests, Sort::quick, &quick_results); 

回答

2

以下版本爲我編譯並運行正常 - 主要更改是修改perform_test聲明,以便參數3在您打算的上下文中正確。還要確保函數模板後面有代碼。

typedef std::vector<std::pair<int, int>> container; 

template<class F> 
void perform_test(int* current, int num_tests, 
    void(* func)(typename F, typename F), container* results) 
{ 
    cout << "invoked thread function" << endl; 
} 

namespace Sort 
{ 
    template<class RandomAccessIterator> 
    void quick(RandomAccessIterator begin, RandomAccessIterator end) 
    { 
     cout << "invoked sort function" << endl; 
    } 

} //namespace Sort 

int main() 
{ 
    container quick_results; 
    int current = 0, num_tests = 30; 

    boost::thread test_thread(
     &perform_test<container::iterator>, 
     &current, 
     num_tests, 
     Sort::quick<container::iterator>, 
     &quick_results);  

    test_thread.join(); 
    return 0; 
}; 
+0

完美,謝謝。 – Rarge 2010-11-01 16:26:50

5

模板函數不是「真正的」函數。編譯器首先需要實例化它。但是爲了讓編譯器做到這一點,它需要知道你想要實例化函數的模板參數的類型。編譯器無法從代碼中推導出這些參數。

但是,如果重寫代碼:

typedef std::vector<std::pair<int, int>> container; 
typedef container::iterator iterator; 

boost::thread test_thread(
    &perform_test<Sort::quick<iterator>>, 
    &current, 
    num_tests, 
    &Sort::quick<iterator>, 
    &quick_results); 

它應該工作。

+0

謝謝你的幫助。 – Rarge 2010-11-01 16:27:20