Igo*_*vic 1 c++ templates sfinae
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;
}
Run Code Online (Sandbox Code Playgroud)
有人可以向我解释为什么这段代码无法编译并提供此错误消息:
C2995'int test_sfinae(T)':函数模板已经定义
我正在使用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;
}
Run Code Online (Sandbox Code Playgroud)
什么时候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);
Run Code Online (Sandbox Code Playgroud)
因此,将选择第一个重载,并且当T
不可轻易地复制时,反向.