2010-10-31 73 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