【问题标题】:boost::thread and template functionsboost::thread 和模板函数
【发布时间】:2010-10-31 19:58:37
【问题描述】:

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

【问题讨论】:

    标签: multithreading templates boost boost-thread


    【解决方案1】:

    模板函数不是“真正的”函数。编译器首先需要实例化它。但是编译器要做到这一点,它需要知道你希望函数被实例化的模板参数的类型。编译器无法从您的代码中推断出这些参数。

    但是,如果您将代码重写为:

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

    它应该可以工作。

    【讨论】:

      【解决方案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;
      };
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2018-06-10
        • 2017-02-20
        • 2011-11-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多