【发布时间】: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 std 和using std::enable_if_t 对std::enable_if_t 无效?
【问题讨论】:
-
typename在这里是不必要的。 -
FWIW,您可能可以使用
is_integral_v<T>而不是is_integral<T>::value,因为您已经拥有enable_if_t<T> -
@Eric :
enable_if_t是 C++14,但is_integral_v是 C++17。