函数模板的默认参数不起作用

nut*_*100 1 c++ templates visual-c++ default-arguments

我有一个函数,如果 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;
    }
}
Run Code Online (Sandbox Code Playgroud)

现在,这个函数默认使用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;
    }
};
Run Code Online (Sandbox Code Playgroud)

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

more<int> a;
function(7,5,a);
Run Code Online (Sandbox Code Playgroud)

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

function(5,7);
Run Code Online (Sandbox Code Playgroud)

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

Vit*_*meo 6

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

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

template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp = {}) {
    // ...
}
Run Code Online (Sandbox Code Playgroud)