【问题标题】:"Function template has already been defined" with mutually exclusive `enable_if`s“功能模板已被定义”与互斥的`enable_if`s
【发布时间】:2019-05-24 01:03:46
【问题描述】:

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;
}

我认为它会起作用,因为存在互斥的 sfinae 条件。你能帮我解决我的理解上的漏洞吗?

【问题讨论】:

标签: c++ templates sfinae typetraits enable-if


【解决方案1】:

是的,他们的签名是一样的;默认模板参数不是函数模板签名的一部分。

您可以将它们更改为

// 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;
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-02-14
    • 2017-08-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多