使用默认参数的C ++函数模板

tangwenqiang
#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&)
Angew不再为SO感到骄傲

无法从默认参数推导出模板参数。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>());
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

C ++函数模板格式

来自分类Dev

函数模板的C ++ Decltype

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

C ++错误:函数模板中可能未使用默认模板参数

来自分类Dev

函数模板的非最后默认模板参数

来自分类Dev

C ++使用可变参数模板绑定成员函数

来自分类Dev

递归可变参数函数模板

来自分类Dev

编写可变参数模板构造函数

来自分类Dev

类型受限的可变参数模板函数

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

函数模板内部的参数推导

来自分类Dev

如何传递可变参数模板函数?

来自分类Dev

可变参数模板函数接受lambda

来自分类Dev

如何重载可变参数模板函数?

来自分类Dev

重载函数模板和继承的参数

来自分类Dev

可变参数模板函数重载失败

来自分类Dev

如何使函数模板成为测试的参数?

来自分类Dev

可变参数模板中的函数顺序

来自分类Dev

模板参数上的C ++函数模板重载

来自分类Dev

Lambda作为成员函数模板的默认参数

来自分类Dev

为不同版本的函数模板识别不同的默认参数

来自分类Dev

使用boost :: function的成员函数模板

来自分类Dev

使用成员函数调用可变参数模板函数

来自分类Dev

C ++在类模板中使用函数模板

来自分类Dev

没有模板参数的可变参数模板函数

来自分类Dev

C ++中没有参数可变参数模板函数

来自分类Dev

将函数模板传递给具有任意参数列表的函数模板

来自分类Dev

函数模板中返回类型的模板参数推导

来自分类Dev

用可变参数模板参数调用零参数模板函数指针吗?