【问题标题】:C++ function template using default parameters使用默认参数的 C++ 函数模板
【发布时间】:2013-09-29 14:53:11
【问题描述】:
#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&)

【问题讨论】:

标签: c++ templates


【解决方案1】:

使用 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&lt;Object&gt;的用法。

【讨论】:

    【解决方案2】:

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

    【讨论】:

    • 当 'findMax' 是类模板的函数成员时,它运行良好。为什么?
    • @tangwenqiang 你的意思是它是一个成员函数模板?或者它是一个普通的成员函数,Comparator 是封闭类模板的模板参数?
    • 1 #include 2 使用命名空间标准; 3 template 4 //class A { 5 // public: 6 Object retself(const Object &initVal = Object()) 7 { 8 return initVal; 9 } 10 //}; 11 int main() 12 { 13 //A 测试; 14 cout
    • @tangwenqiang 因为当它是类模板的非模板成员函数时,模板参数来自封闭类模板,不必推导。所以那里没问题。
    【解决方案3】:

    默认模板参数和函数参数。使用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

    【讨论】:

      猜你喜欢
      • 2012-03-26
      • 2016-03-01
      • 1970-01-01
      • 2015-05-09
      • 2011-06-11
      • 2021-11-01
      • 2021-04-06
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多