boost :: thread и шаблонные функции - PullRequest
3 голосов
/ 31 октября 2010

Я пытаюсь запустить функцию шаблона в отдельном потоке, но 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 ]

5 голосов
/ 01 ноября 2010

Функция шаблона не является «реальной» функцией.Сначала компилятору необходимо создать его экземпляр.Но для того, чтобы компилятор сделал это, он должен знать типы параметров шаблона, для которых вы хотите, чтобы функция создавалась.Компилятор не может вывести эти параметры из вашего кода.

Однако, если переписать код как:

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 голосов
/ 01 ноября 2010

Следующая версия компилируется и запускается для меня нормально - главное изменение - изменить объявление 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;
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...