当我尝试使用 MSCL 19 编译以下代码时,一切正常。但是,当我尝试 g++ 6.2.0 和 clang 3.9.0 时,出现类似 expectednested-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);
}
添加使用 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
的使用没有任何嵌套(没有 ::
)。删除 typename
使其可以与 gcc 一起使用。
关于c++ - 使用命名空间和 using 指令不适用于 std::enable_if_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564553/