C では、テンプレート引数の条件付き型選択に std::enable_if が使用されます。新しい構文 typename std::enable_if_t<...> を使用する場合。 typename std::enable_if<...>::type* の代わりに、コンパイラで再定義エラーが発生する可能性があります。
理由を理解するには、次のコードを考慮してください。
template<typename T, typename std::enable_if<std::is_same<int, T>::value>::type* = nullptr> void f() { } template<typename T, typename std::enable_if<std::is_same<double, T>::value>::type* = nullptr> void f() { }
これコードでは、T が int か double かに基づいて f をオーバーロードする 2 つのテンプレートを宣言しています。ただし、std::enable_if_t を使用するようにコードが更新されると、再定義エラーが発生します:
template<typename T, typename = std::enable_if_t<std::is_same<int, T>::value>> void g() { } template<typename T, typename = std::enable_if_t<std::is_same<double, T>::value>> void g() { }
エラーの理由は、2 番目のテンプレート引数のデフォルト値が異なっていても、テンプレートは依然として同じ型の template
この問題を解決するには、テンプレート引数のenable_if 句を削除し、typename を class に置き換えます。
template<class T, class U /* = std::enable_if_t<std::is_same<int, T>::value> */> void g() { } template<class T, class U /* = std::enable_if_t<std::is_same<double, T>::value> */> void g() { }
または、2 番目のテンプレート引数に別の型を指定することもできます:
template<class T, std::enable_if_t<std::is_same<int, T>::value, int> = nullptr> void g() { } template<class T, std::enable_if_t<std::is_same<double, T>::value, int> = nullptr> void g() { }
以上がテンプレート引数で「enable_if_t」を使用すると再定義エラーが発生するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。