我有以下程序,编译 运行,没有问题
#include <thread>
#include <future>
#include <iostream>
#include <algorithm>
void f(int* first,
int* last,
std::promise<int> accumulate_promise)
{
int sum = std::accumulate(first, last, 0);
accumulate_promise.set_value(sum); // Notify future
}
int main()
{
int numbers[] = { 1, 2, 3, 4, 5, 6 };
std::promise<int> accumulate_promise;
std::future<int> accumulate_future = accumulate_promise.get_future();
std::thread work_thread(f, begin(numbers), end(numbers),
std::move(accumulate_promise));
accumulate_future.wait(); // wait for result
std::cout << "result=" << accumulate_future.get() << 'n';
work_thread.join(); // wait for thread completion
}
但是,如果我将" F"更改为模板:
template<typename Iterator>
void f(Iterator first,
Iterator last,
std::promise<int> accumulate_promise)
{
int sum = std::accumulate(first, last, 0);
accumulate_promise.set_value(sum); // Notify future
}
然后它失败了编译,GCC报告thread :: thread()ctor找不到正确的过载:错误:呼叫'std :: thread :: thread(,int*,int*,std :: remove_reference&amp;> :: type)无匹配函数)'
我的模板有什么意见的消息?如何修复它?
谢谢。
f
是模板。
std::thread work_thread(f, begin(numbers), end(numbers),
std::move(accumulate_promise));
用松散的术语说, std::thread
的第一个参数是函数指针,要么是像功能指针一样的作用。它不会将模板作为第一个参数。
实例化时,模板变为类或函数。使用模板时会实例化。因此,给定此模板定义,并以这样的方式使用它:
f(something.begin(), something.end(), some_kind_of_a_promise);
这实例化模板并使用。明确实例化模板,而无需使用:
f<int *>
现在,您在这里有一个实例化模板。以下作品在这里:
std::thread work_thread(f<int *>, std::begin(numbers),
std::end(numbers),
std::move(accumulate_promise));
用GCC 5.3.1