"Function template has already been defined" 与互斥的 `enable_if`
"Function template has already been defined" with mutually exclusive `enable_if`s
MSVC 为以下代码产生错误("function template has already been defined"):
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;
}
我认为它会起作用,因为存在相互排斥的 sfinae 条件。你能帮我解决我理解上的漏洞吗?
是的,他们的签名是一样的;默认模板参数不是函数模板签名的一部分。
您可以将它们更改为
// 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;
}
MSVC 为以下代码产生错误("function template has already been defined"):
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;
}
我认为它会起作用,因为存在相互排斥的 sfinae 条件。你能帮我解决我理解上的漏洞吗?
是的,他们的签名是一样的;默认模板参数不是函数模板签名的一部分。
您可以将它们更改为
// 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;
}