当我尝试使用MSCL 19编译以下代码时,就可以了。但是,当我尝试使用g ++ 6.2.0和clang 3.9.0时,出现类似以下错误expected nested-name-specifier class=typename
#include<type_traits>
using namespace std;
template<class T,class=typename enable_if_t<
is_signed<T>::value&&is_integral<T>::value&&(sizeof(T)>1)>>
void f(T i) {}
int main() {
f(1);
}
添加using std::enable_if_t
将产生相同的结果。
#include<type_traits>
using namespace std;
using std::enable_if_t;
template<class T,class=typename enable_if_t<
is_signed<T>::value&&is_integral<T>::value&&(sizeof(T)>1)>>
void f(T i) {
}
int main(){
f(1);
}
可以通过在前面enable_if_t
加上前缀来解决此问题std::
:
#include<type_traits>
using namespace std;
template<class T,class=typename std::enable_if_t<
is_signed<T>::value&&is_integral<T>::value&&(sizeof(T)>1)>>
void f(T i) {
}
int main(){
f(1);
}
为什么using namespace std
和using std::enable_if_t
都无效std::enable_if_t
?
它尝试告诉您的是何时看到typename
其下一个嵌套类型说明符。并且enable_if_t
不带任何嵌套地使用(no ::
)。删除typename
使其可以与gcc一起使用。
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句