gpt4 book ai didi

c++ - 线程不适用于带有模板参数的函数

转载 作者:搜寻专家 更新时间:2023-10-31 00:11:55 25 4
gpt4 key购买 nike

我正在尝试实现多线程合并排序,但我的尝试编译失败。这是我的代码:

template <class RandomAccessIterator>
void merge_sort (RandomAccessIterator begin,RandomAccessIterator end)
{
int N = end - begin;
int N1,N2;

if (N == 1)
return;

RandomAccessIterator mid = begin + (end-begin)/2;


// merge_sort (begin,mid); // this is OK
// merge_sort (mid,end); // this is OK

thread t1 (merge_sort,begin,mid); // error
thread t2 (merge_sort,mid,end); // error

t1.join ();
t2.join ();

N1 = mid - begin;
N2 = end - mid;

merge (begin,N1,mid,N2);
}

来自 gcc 的错误消息(g++ -std=c++11 merge-multithread.cpp):

merge-multithread.cpp: In instantiation of ‘void merge_sort(RandomAccessIterator, RandomAccessIterator) [with RandomAccessIterator = int*]’:
merge-multithread.cpp:76:25: required from here
merge-multithread.cpp:60:33: error: no matching function for call to ‘std::thread::thread(<unresolved overloaded function type>, int*&, int*&)’
thread t1 (merge_sort,begin,mid);
^
In file included from merge-multithread.cpp:4:0:
/usr/include/c++/5.2.0/thread:133:7: note: candidate: template<class _Callable, class ... _Args> std::thread::thread(_Callable&&, _Args&& ...)
thread(_Callable&& __f, _Args&&... __args)
^
/usr/include/c++/5.2.0/thread:133:7: note: template argument deduction/substitution failed:
merge-multithread.cpp:60:33: note: couldn't deduce template parameter ‘_Callable’
thread t1 (merge_sort,begin,mid);
^
In file included from merge-multithread.cpp:4:0:
/usr/include/c++/5.2.0/thread:128:5: note: candidate: std::thread::thread(std::thread&&)
thread(thread&& __t) noexcept
^
/usr/include/c++/5.2.0/thread:128:5: note: candidate expects 1 argument, 3 provided
/usr/include/c++/5.2.0/thread:122:5: note: candidate: std::thread::thread()
thread() noexcept = default;

最佳答案

merge_sort 本身就是一个函数模板;要获取您需要指定所有模板参数的实例化函数之一的地址:

thread t1 (&merge_sort<RandomAccessIterator>,begin,mid);
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^

或使用静态转换:

thread t1 (static_cast<void(*)(RandomAccessIterator,RandomAccessIterator)>(&merge_sort),begin,mid);

...或者使用 lambda 表达式,让编译器自动推断参数的类型:

thread t1 ([begin,mid]{merge_sort(begin, mid);});

关于c++ - 线程不适用于带有模板参数的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32100865/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com