使用namespace和using指令不适用于std :: enable_if_t

时间:2016-11-12 15:44:39

标签: c++ c++11 c++14

当我尝试使用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 stdusing std::enable_if_tstd::enable_if_t无效?

1 个答案:

答案 0 :(得分:2)

它试图告诉你的是它何时看到typename它希望下一个嵌套类型说明符。使用enable_if_t时没有任何嵌套(无::)。删除typename会使其与gcc一起使用。