なぜgcc48とclang32でコンパイルされないのですか?enable_ifでコンパイルエラーが発生する理由
#include <type_traits>
template <int N>
struct S {
template<class T>
typename std::enable_if<N==1, int>::type
f(T t) {return 1;};
template<class T>
typename std::enable_if<N!=1, int>::type
f(T t) {return 2;};
};
int main() {
S<1> s1;
return s1.f(99);
}
GCCエラー:
/home/lvv/p/sto/test/t.cc:12:2: error: no type named ‘type’ in ‘struct enable_if<false, int>’
f(T t) {return 2;};
^
CLANGエラー:
/home/lvv/p/sto/test/t.cc:11:26: error: no type named 'type' in 'std::enable_if<false, int>'; 'enable_if' cannot be used to
disable this declaration
typename std::enable_if<N!=1, int>::type
^~~~
/home/lvv/p/sto/test/t.cc:16:7: note: in instantiation of template class 'S<1>' requested here
S<1> s1;
^
EDIT - SOLUTION
私は実用的な理由のために、チャールズサルビアからの答えを受け入れてきたI提案された回避策を使用できませんでした(Nに特化しています)。私は私のために働く他の回避策を見つけました。
typename std::enable_if<(sizeof(T),N==1), int>::type
を印刷しますが、あなたはこれがとにかく仕事に行くされてよろしいですか? 'enable_if'が単純なテンプレートクラスであると仮定しているのではなく、言語構造体として実装されていない限り、戻り値の型だけでメソッドをオーバーロードすることはできません。 – zneak
enable_ifをTに依存する必要があるのはなぜですか? –
解決策は私のためには機能しません!私は 'エラー:呼び出しのための一致する機能がありませんでした... ' –