【问题标题】:Using namespace and using directive not working for std::enable_if_t使用命名空间和使用指令不适用于 std::enable_if_t
【发布时间】:2016-11-12 23:49:02
【问题描述】:

当我尝试使用 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 无效?

【问题讨论】:

  • typename 在这里是不必要的。
  • FWIW,您可能可以使用is_integral_v&lt;T&gt; 而不是is_integral&lt;T&gt;::value,因为您已经拥有enable_if_t&lt;T&gt;
  • @Eric : enable_if_t 是 C++14,但 is_integral_v 是 C++17。

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


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-10-14
    • 2011-01-02
    • 1970-01-01
    • 2011-07-01
    • 1970-01-01
    • 2015-10-05
    相关资源
    最近更新 更多