Функция шаблона не будет компилироваться при вызове как нить - PullRequest
6 голосов
/ 01 декабря 2011

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

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

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

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

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

Ответы [ 4 ]

7 голосов
/ 01 декабря 2011

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

template <class TYPE_size=int>

или

thread one(Threader<int>, counter);
5 голосов
/ 01 декабря 2011

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

#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;
}
4 голосов
/ 01 декабря 2011

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

Попробуйте:

 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;
}
0 голосов
/ 03 февраля 2016

В 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;
}

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...