2017-05-14 4 views
0
ここ

がSFINAEの正しいコード(demo)である: -コーダ・エラーを防ぐ - に "::タイプ" を追加することを忘れ "のstd :: enable_if <> ::タイプ"(SFINAE)

template<bool b> class C { 
    public: template<bool b2=b> typename std::enable_if<b2,void>::type f(){ 
     cout<<"no!!"; 
    } 
}; 
int main() { 
    //C<false> c1; c1.f(); <-- not compilable (it is good) 
    C<true> c2; c2.f(); 
    return 0; 
} 

私はC++にはまだ新しく、まだ慣れていません。その結果
、私は頻繁に::type追加することを忘れ: -

残念ながら
public: template<bool b2=b> std::enable_if<b2,void> f(){ 
     cout<<"no!!"; 
    } 

を、でもそれは間違っている、それは<false>demo)のためのコンパイルです。私の悪い日で

、私も限り行く: - それはまだ<false>ためのコンパイルで

public: std::enable_if<b,void> f(){ 
     cout<<"no!!"; 
    } 

! (demo)。

私はどのように間違っているのか知っていますが、私はしばしば実際にそのような間違いを犯します。

質問: この状況でコーダーのエラーを防ぐには、コンパイラーの警告の他に、どのようにしますか?

+0

コンパイラの警告はなぜですか?このようなエラーを防ぐために作られています。 '-Werror'フラグを使ってコンパイルが成功しないことを確認したい場合 – user463035818

+0

すべての警告を有効にしてコンパイルしてください。それは非void関数から値を返さないことについての警告を与えるはずです。 [例](http://coliru.stacked-crooked.com/a/b331b8b07a29d516) –

+0

@ tobi303そんなに素人に聞こえるかもしれませんが、他のばかな証拠があるかどうか知りたいです。より良い=より良い。 XD – javaLover

答えて

2

C++ 14は、プログラマーがネストされた型を明示的に参照する必要がなくなるため、この間違いが許されません。 enable_ifは、あなた自身のソースコードでそれをブラックリストに載せることさえできないように、あなた自身のコードを決めることができます。

+0

私はこれについて一度も知りませんでした。 – javaLover

+0

2番目のケース 'public:std :: enable_if f()'についても絶対に知っていますか? – javaLover

+0

@ javaLover 'enable_if'をブラックリストに載せれば、それはすでに動作しません。 – hvd

関連する問題