3

我正在尝试在单独的线程上运行模板函数,但 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);
4

2 回答 2

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); 

它应该工作。

于 2010-11-01T02:28:24.153 回答
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;
};
于 2010-11-01T14:53:59.967 回答