Аргумент по умолчанию для шаблона функции не работает - PullRequest
1 голос
/ 17 февраля 2020

У меня есть функция, которая выводит значение 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;
    }
}

Теперь эта функция по умолчанию использует объект меньшего размера, чтобы решить распечатать value_one вне или нет, но также может использовать более функциональный объект.

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 по умолчанию будет меньше, если явно не предоставлено, и, таким образом, все еще сможет работать. Почему это не работает? Есть ли способ заставить этот код работать без перегрузки, чтобы иметь только два параметра?

1 Ответ

6 голосов
/ 17 февраля 2020

Вы установили по умолчанию тип cmp, но не аргумент функции. На самом деле вы не дали ему никакого имени.

Вам также необходимо указать значение по умолчанию для аргумента:

template<typename T, typename cmp = less<T> >
void function(T value_one, T value_two, cmp = {}) {
    // ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...