«Шаблон функции уже определен» с взаимоисключающим `enable_if`s - PullRequest
1 голос
/ 24 мая 2019

MSVC выдает ошибку («шаблон функции уже определен») для следующего кода:

template<typename T, typename = std::enable_if_t<std::is_default_constructible<T>::value>>
auto foo(T&& val) {
    return 0;
}

// note difference from above --->               !
template<typename T, typename = std::enable_if_t<!std::is_default_constructible<T>::value>>
auto foo(T&& val) {
    return 0;
}

Я думал, что это сработает, потому что существуют взаимоисключающие условия. Можете ли вы помочь мне с дырой в моем понимании?

1 Ответ

3 голосов
/ 24 мая 2019

Да, их подписи одинаковы;аргументы шаблона по умолчанию не являются частью сигнатуры шаблона функции.

Вы можете изменить их на

// the 2nd non-type template parameter are different
template<typename T, std::enable_if_t<std::is_default_constructible<T>::value>* = nullptr>
auto foo(T&& val) {
    return 0;
}

template<typename T, std::enable_if_t<!std::is_default_constructible<T>::value>* = nullptr>
auto foo(T&& val) {
    return 0;
}

Или

// the return type are different
template<typename T>
std::enable_if_t<std::is_default_constructible<T>::value, int> foo(T&& val) {
    return 0;
}

template<typename T>
std::enable_if_t<!std::is_default_constructible<T>::value, int> foo(T&& val) {
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...