c++ - 使用命名空间和 using 指令不适用于 std::enable_if_t

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

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

最佳答案

它试图告诉您的是,当它看到 typename 时,它期望接下来是一个嵌套类型说明符。并且 enable_if_t 的使用没有任何嵌套(没有 ::)。删除 typename 使其可以与 gcc 一起使用。

关于c++ - 使用命名空间和 using 指令不适用于 std::enable_if_t,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40564553/

相关文章:

c++ - 为什么我们必须在箭头符号( -> )之后再次指定数据类型

c++ - 凭经验确定 C++11 表达式的值类别?

c++ - 未命名命名空间内名称的外部链接

c++ - 判断函数是否为const

使用模板的 C++ 惰性求值

c++ - 设置二维矩阵时避免段错误

c++ - 未定义的函数引用错误

c++ - 未创建 Keil uVision5 .axf 文件

c++ - 在 C++11 时钟之间转换

c++ - 如何使用调试符号构建 openssl? [添加 libeay.pdb]