模板无法<typename>推断指针类型?



我有以下程序,编译 运行,没有问题

#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

测试

最新更新