boost ::线程和模板函数

时间:2010-10-31 19:58:38

标签: multithreading templates boost boost-thread

我正在尝试在单独的线程上运行模板函数,但IntelliSense(VC ++ 2010 Express)一直给我错误: “错误:没有构造函数的实例”boost :: thread :: thread“匹配参数列表” 如果我尝试编译我得到这个错误: “错误C2661:'boost :: thread :: thread':没有重载函数需要5个参数”

错误只发生在我添加模板后所以我确定它与它们有关但我不知道是什么。

我传递给boost :: thread的两个参数是模板函数,定义为:

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 :: thread:

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 个答案:

答案 0 :(得分: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); 

它应该有用。

答案 1 :(得分: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;
};