C++ SFINAE没有使用一个非常简单的示例 模板 内联 内部测试(T tc){ 返回1; } 模板> 内联 内部测试(ntc){ 返回2; }

C++ SFINAE没有使用一个非常简单的示例 模板 内联 内部测试(T tc){ 返回1; } 模板> 内联 内部测试(ntc){ 返回2; },c++,templates,sfinae,C++,Templates,Sfinae,有人能给我解释一下为什么这段代码无法编译,并给出以下错误信息: C2995“int test_sfinae(T)”:已定义函数模板 我使用的是MVSC。默认模板参数不参与重载解析,因此您的两个声明实际上是相同的 您可以将声明重写如下: template<typename T, typename = std::enable_if_t<std::is_trivially_copyable<T>::value>> inline int test_sfinae(T t

有人能给我解释一下为什么这段代码无法编译,并给出以下错误信息:

C2995“int test_sfinae(T)”:已定义函数模板


我使用的是MVSC。

默认模板参数不参与重载解析,因此您的两个声明实际上是相同的

您可以将声明重写如下:

template<typename T, typename = std::enable_if_t<std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T tc) {
    return 1;
}

template<typename T, typename = std::enable_if_t<!std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T ntc) {
    return 2;
}

因此,将选择第一个重载,当
T
不可复制时,将选择相反的重载。

默认模板参数不参与重载解析,因此您的两个声明实际上是相同的

您可以将声明重写如下:

template<typename T, typename = std::enable_if_t<std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T tc) {
    return 1;
}

template<typename T, typename = std::enable_if_t<!std::is_trivially_copyable<T>::value>>
inline
int test_sfinae(T ntc) {
    return 2;
}

因此,将选择第一个重载,当
T
不可复制时,选择相反的重载。

Yeap,这就成功了。谢谢是否有一种方法可以将enable_if与返回值一起使用,以获得相同的结果?是的,只需将
int
替换为整个
std::enable_if_t
表达式(没有
=0
),它也应该这样做,但通常建议不要这样做。谢谢是否有可能使用带有返回值的enable_if来获得相同的结果?是的,只需将
int
替换为整个
std::enable_if_t
表达式(没有
=0
),它也应该这样做,但通常建议不要这样做。您可能会看到与您的错误相似的注释。相关的和您可能会看到与您的错误相似的注释。相关的和
template <typename T, int = 0>
inline int test_sfinae(T tc);

template <typename T, /* Something that does not compile... */ = 0>
inline int test_sfinae(T ntc);