【发布时间】:2019-05-13 12:38:21
【问题描述】:
今天我尝试实现基数排序。该函数必须有两个变量:开始迭代器和结束迭代器,并且可以有第三个:一些必须返回整数类型以进行排序的函数。默认必须是恒等函数。
我的尝试看起来像(抱歉,代码看起来很长很脏,但这只是一个尝试):
template<class ForwardIt>
void radix_sort(
ForwardIt first,
ForwardIt last,
std::function<auto(typename std::iterator_traits<ForwardIt>::value_type)> get_value =
[](const typename std::iterator_traits<ForwardIt>::value_type& x){ return x; }) {
// ...
}
get_value的返回类型,当然在编译时就知道了。
用法应该是:
std::vector<std::pair<uint32_t, std::string>> vec;
// ...
radix_sort(vec.begin(), vec.end(), [](const std::pair<uint32_t, std::string>& x){ return x.first; })
或者:
std::vector<uint32_t> vec;
// ...
radix_sort(vec.begin(), vec.end());
它甚至没有编译,我不知道如何解决这个问题。怎么做?简单例子:
#include <bits/stdc++.h>
template<class ForwardIt>
void radix_sort(
ForwardIt first,
ForwardIt last,
std::function<auto(typename std::iterator_traits<ForwardIt>::value_type)> get_value =
[](const typename std::iterator_traits<ForwardIt>::value_type& x){ return x; }) {
// ...
}
int main()
{
std::vector<std::pair<uint32_t, std::string>> vec(10);
radix_sort(vec.begin(), vec.end());
}
编译器输出:
source_file.cpp:17:37: error: no matching function for call to ‘radix_sort(std::vector<unsigned int>::iterator, std::vector<unsigned int>::iterator)’
radix_sort(vec.begin(), vec.end());
^
source_file.cpp:6:6: note: candidate: template<class ForwardIt, class auto:1> void radix_sort(ForwardIt, ForwardIt, std::function<auto:1(typename std::iterator_traits<_Iter>::value_type)>)
void radix_sort(
^
source_file.cpp:6:6: note: template argument deduction/substitution failed:
source_file.cpp:17:37: note: couldn't deduce template parameter ‘auto:1’
radix_sort(vec.begin(), vec.end());
【问题讨论】:
-
编译器是怎么说的? --> 只需将编译器错误/警告/输出添加到您的帖子中,如果不是为了其他原因,那么只是为了完整性。
-
请参阅How to Ask 以改进您的问题
-
我认为模板中的
仅在您拥有 C++17 并且问题标记为 C++11 时才有效。见this answer。可能还有其他问题我没有花时间仔细分析问题,但我会从可用的标准开始。 -
@Clonk:实例化模板时,
auto不起作用。 -
@JoeyMallone 在您使用它的同一个 .cpp 文件中实现模板没有问题。当您想在多个不同的包含标头的 .cpp 文件中使用模板时,您只需要在标头中实现它们。模板不能在 .cpp 文件中没有任何内在原因。