Функция шаблона не будет компилироваться при вызове как нить

c++ multithreading templates c++11

5570 просмотра

4 ответа

1385 Репутация автора

У меня есть проблема, связанная с функциями шаблона и потоками:

template <class TYPE_size>
void Threader(TYPE_size counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    thread one(Threader,counter);
    one.join();    
    cout << counter;
}

Это не компилируется; Я получил:

ошибка: нет соответствующей функции для вызова âstd :: thread :: thread (, unsigned int &)

Если я удаляю шаблон, он компилируется, и если я изменяю вызов функции на стандартный вызов функции, а не поток (все еще использующий шаблон), он компилируется.

Кто-нибудь знает, почему это?

Я использую Centos5 64 бит.

 error: no matching function for call to âstd::thread::thread(<unresolved overloaded function type>, unsigned int&)â
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:124: note: candidates are: std::thread::thread(std::thread&&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:122: note:                 std::thread::thread(const std::thread&)
/usr/lib/gcc/x86_64-redhat-linux6E/4.4.0/../../../../include/c++/4.4.0/thread:121: note:                 std::thread::thread()
Автор: Columbo Источник Размещён: 01.12.2011 02:22

Ответы (4)


9 плюса

2680 Репутация автора

Решение

Нет функции с именем Threader. Когда вы пишете Threader<int>или что-то, то компилятор создает функцию. Если вы потом напишите Threader<float>, то компилятор создаст новую функцию. Вы можете предоставить параметр шаблона по умолчанию или указать его при вызове.

template <class TYPE_size=int>

или же

thread one(Threader<int>, counter);
Автор: Colin Размещён: 01.12.2011 02:26

4 плюса

4444 Репутация автора

Вы пропустили список аргументов вашего шаблона.

Пытаться:

 unsigned int counter = 100;
 thread one(Threader<unsigned int>,counter);

или, если вы используете стандарт c ++ x0 / c ++ 11, присвойте вашему шаблону стандартный тип, например:

template <typename TYPE_size = unsigned int>
void Threader(TYPE_size counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    thread one(Threader<>,counter);
    one.join();    
    cout << counter;
}
Автор: Michael Haidl Размещён: 01.12.2011 02:27

5 плюса

385460 Репутация автора

Я позволю себе предложить множество исправлений для достижения того, что, по моему мнению, является предполагаемым поведением:

#include <thread>

template <typename T>
void Threader(T & counter)    // take by reference!
{
   counter++;
}

int main()
{
   unsigned int counter = 100;
   std::thread one(Threader<unsigned int>,   // specify template *instance*
                   std::ref(counter) );      // pass variable as reference
   one.join();
   return counter;
}
Автор: Kerrek SB Размещён: 01.12.2011 02:50

0 плюса

25408 Репутация автора

В C ++ 11 введены лямбды, это можно использовать и в этом случае.

По сути, поток создается с использованием лямбды, где лямбда вызывает функцию, которая затем позволяет проводить вывод типа шаблона.

thread one([counter]() { Threader(counter); });

Выше счетчик фиксируется по значению, но, как показывают некоторые ответы, захват по ссылке также может быть использован

#include <iostream>
#include <thread>
template <class T>
void Threader(T& counter)
{
    counter++;
}
int main()
{
    unsigned int counter = 100;
    std::thread one([&counter]() { Threader(counter); });
    one.join();    
    std::cout << counter;
}

Примечание : этот вопрос был помечен как дубликат, поэтому добавлено использование новых языковых функций.

Автор: Niall Размещён: 03.02.2016 09:27
Вопросы из категории :
32x32