SFINAE 没有使用一个非常简单的例子
SFINAE not working with a very simple example
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;
}
有人可以向我解释为什么此代码无法编译并给出此错误消息:
C2995 'int test_sfinae(T)': function template has already been defined
我正在使用 MVSC。
默认模板参数不参与重载决议,所以你的两个声明实际上是相同的。
您可以按如下方式重写声明:
template <typename T,
std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T tc) {
return 1;
}
template <typename T,
std::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T ntc) {
return 2;
}
当 T
可简单复制时,声明将显示为:
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);
因此将选择第一个重载,而当 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;
}
有人可以向我解释为什么此代码无法编译并给出此错误消息:
C2995 'int test_sfinae(T)': function template has already been defined
我正在使用 MVSC。
默认模板参数不参与重载决议,所以你的两个声明实际上是相同的。
您可以按如下方式重写声明:
template <typename T,
std::enable_if_t<std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T tc) {
return 1;
}
template <typename T,
std::enable_if_t<!std::is_trivially_copyable<T>::value, int> = 0>
inline int test_sfinae(T ntc) {
return 2;
}
当 T
可简单复制时,声明将显示为:
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);
因此将选择第一个重载,而当 T
不可平凡复制时的逆过程。