Функция шаблона не будет компилироваться при вызове как нить
5570 просмотра
4 ответа
У меня есть проблема, связанная с функциями шаблона и потоками:
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
Источник
Размещён: 12.11.2019 09:37
Ответы (4)
9 плюса
Нет функции с именем Threader. Когда вы пишете Threader<int>
или что-то, то компилятор создает функцию. Если вы потом напишите Threader<float>
, то компилятор создаст новую функцию. Вы можете предоставить параметр шаблона по умолчанию или указать его при вызове.
template <class TYPE_size=int>
или же
thread one(Threader<int>, counter);
Автор: Colin
Размещён: 01.12.2011 02:26
5 плюса
Я позволю себе предложить множество исправлений для достижения того, что, по моему мнению, является предполагаемым поведением:
#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
4 плюса
Вы пропустили список аргументов вашего шаблона.
Пытаться:
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
0 плюса
В 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Вопросы из категории :
- c++ What are the barriers to understanding pointers and what can be done to overcome them?
- c++ Какой самый простой способ для анализа файла INI в C ++?
- c++ Когда вы должны использовать «друг» в C ++?
- c++ Как вы очищаете переменную stringstream?
- c++ В C ++ конструктор и деструктор могут быть встроенными функциями?
- multithreading Что такое состояние гонки?
- multithreading Что такое тупик?
- multithreading Что такое мьютекс?
- multithreading Как начать потоки в plain C?
- multithreading Потокобезопасный foreach перечисление списков
- templates Изменить шаблоны в Xcode
- templates Каковы различия между «универсальными» типами в C ++ и Java?
- templates Как добавить отражение в приложение C ++?
- templates Проверьте, имеет ли класс функцию-член с заданной сигнатурой
- templates Есть ли способ отладки шаблонов Velocity в традиционном смысле отладки кода?
- c++11 Можно ли напечатать тип переменной в стандартном C ++?
- c++11 Что такое умный указатель и когда я должен его использовать?
- c++11 Как вы можете перебирать элементы std :: tuple?
- c++11 Что делает static_assert и для чего вы его используете?