【问题标题】:Default Argument for Function Template not working函数模板的默认参数不起作用
【发布时间】:2020-06-01 10:18:17
【问题描述】:

我有一个函数,如果 value_one 大于或小于 value_two 基于通过的比较,则打印出它。

template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp) {
    cmp comparator;
    if (comparator(value_one, value_two)) {
        std::cout << value_one;
    }
}

现在,这个函数默认使用less函数对象来决定是否打印value_one,但也可以使用more函数对象。

template<typename T>
class more {
public:
    bool operator()(const T& value_one, const T& value_two) {
        return value_one > value_two;
    }
};

template<typename T>
class less{
public:
    bool operator()(const T& value_one, const T& value_two) {
        return value_one < value_two;
    }
};

当我在 main 中调用以下代码时

more<int> a;
function(7,5,a);

7 按预期打印,但下一个代码被认为是非法的,VS 告诉我找不到匹配的重载函数。

function(5,7);

我认为 cmp 函数对象在未明确提供时默认为 less,因此仍然可以工作。为什么这不起作用?有没有办法让这段代码工作而不重载它只有两个参数?

【问题讨论】:

    标签: c++ templates visual-c++ default-arguments


    【解决方案1】:

    您已经默认了 type cmp,但没有默认函数的参数。事实上,你并没有给它起任何名字。

    您还需要为参数提供默认值:

    template<typename T, typename cmp = less<T> >
    void function(T value_one, T value_two, cmp = {}) {
        // ...
    }
    

    【讨论】:

    • 提供一个默认构造的cmp实例作为默认参数
    猜你喜欢
    • 1970-01-01
    • 2021-09-03
    • 1970-01-01
    • 1970-01-01
    • 2011-06-11
    • 1970-01-01
    • 1970-01-01
    • 2015-07-08
    • 2016-11-09
    相关资源
    最近更新 更多