#include <iostream>
#include <vector>
#include <string>
#include <cstring>
#include <functional>
using namespace std;
template <typename Object, typename Comparator>
const Object &findMax(const vector<Object> &arr,
const Comparator &isLessThan = less<Object>())
{
int maxIndex = 0;
for (int i = 1; i < arr.size(); i++) {
if (isLessThan(arr[maxIndex], arr[i])) {
maxIndex = i;
}
}
return arr[maxIndex];
}
int main()
{
vector<string> arr(3);
arr[0] = "ZED";
arr[1] = "alli";
arr[2] = "crocode";
//...
cout << findMax(arr) << endl;
return 0;
}
当我用g ++编译它时,它会出现以下错误:
test4.cpp: In function ‘int main()’:
test4.cpp:48:24: error: no matching function for call to ‘findMax(std::vector<std::basic_string<char> >&)’
test4.cpp:48:24: note: candidate is:
test4.cpp:10:15: note: template<class Object, class Comparator> const Object& findMax(const std::vector<Object>&, const Comparator&)
答案 0 :(得分:12)
无法从默认参数推断出模板参数。 C ++ 11,[temp.deduct.type]§5:
未推断的上下文是:
- ...
- 函数参数的参数类型中使用的模板参数,该参数具有在正在进行参数推断的调用中使用的默认参数。
- ...
你可以使用重载来解决这个问题:
template <typename Object, typename Comparator>
const Object &findMax(const vector<Object> &arr, const Comparator &isLessThan)
{
int maxIndex = 0;
for (int i = 1; i < arr.size(); i++) {
if (isLessThan(arr[maxIndex], arr[i])) {
maxIndex = i;
}
}
return arr[maxIndex];
}
template <typename Object>
const Object &findMax(const vector<Object> &arr)
{
return findMax(arr, std::less<Object>());
}
答案 1 :(得分:4)
默认模板参数和函数参数。使用max_element
(实际上,甚至不要定义此函数,只需使用max_element
,无论你在哪里调用它。)
template <typename Object, typename Comparator = std::less<Object>>
const Object &findMax(const vector<Object> &arr, Comparator comp = Comparator())
{
return *std::max_element(arr.cbegin(), arr.cend(), comp);
}
免责声明:未经测试,必须具有C ++ 11
答案 2 :(得分:3)
在C ++ 11中使用默认模板参数,您的函数可以这样编写:
template <typename Object, typename Comparator = std::less<Object> >
const Object &findMax(const vector<Object> &arr, const Comparator isLessThan = Comparator())
{
int maxIndex = 0;
for (int i = 1; i < arr.size(); i++) {
if (isLessThan(arr[maxIndex], arr[i])) {
maxIndex = i;
}
}
return arr[maxIndex];
}
请注意使用默认模板参数typename Comparator = std::less<Object>
。