2016-11-12 7 views
2

MSCL 19を使用して次のコードをコンパイルしようとしましたが問題ありません。私はG ++ 6.2.0と打ち鳴らす3.9.0をしようとしたときしかし、私は同じ結果を生成しますusing std::enable_if_tを追加expected nested-name-specifier class=typename名前空間を使用し、std :: enable_if_tで動作しないディレクティブを使用する

#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); 
} 

のようなエラーが発生しました。

#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); 
} 

この問題はstd::enable_if_tを付けることによって解決することができます:

#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に無効であるのはなぜ?

+3

ここでは、「typename」は不要です。 'enable_if_t'はC++ 14であるが、' is_integral_v'はC:あなたはすでに '' – cpplearner

+0

FWIW、あなたは、 'is_integral_v 'の代わりに 'is_integral の:: [値]を使用することができるかもしれません++ 17。 – Eric

+1

@Ericをenable_if_tしておりますので – ildjarn

答えて

2

あなたに伝えようとしているのは、typenameが次にネストされた型指定子を受け取ると見なされるときです。 enable_if_tは、ネストなしで使用されます(::はありません)。 typenameを削除すると、gccで動作します。

関連する問題