テンプレート引数の衝突: 定義でenable_if_t が失敗する理由
テンプレート プログラミングでは、条件付きで有効にする必要がある状況に遭遇することは珍しくありません。または、特定の条件に基づいてテンプレート機能を無効にします。このような場合、これを実現するために std::enable_if テンプレートがよく使用されます。ただし、std::enable_if_t の新しい構文を採用しようとした最近の試みにより、予期しないエラーが発生しました。
以下のコード スニペットでは、std::enable_if:
を使用して 2 つのテンプレート関数 f() を定義しています。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() { }
新しい 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() { }
GCC が次のエラーを報告します:
error: redefinition of 'template<class T, class> void g()' void g() { }
このエラーが発生する理由を理解するには、テンプレート引数の構文を調べる必要があります。不要なコードを削除すると、関数は次のように簡略化されて表現されます:
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() { }
デフォルト値の違いに関係なく、両方のテンプレートが同じ型 template
この問題を解決するには、2 番目の引数を依存型を持つポインター型に変更できます。
template< class T, std::enable_if_t<std::is_same<int, T>::value, int>* = nullptr > void f() { } template< class T, std::enable_if_t<std::is_same<double, T>::value, int>* = nullptr > void f() { }
この変更されたコードでは、テンプレート関数のシグネチャが一意になり、競合が解消され、正しいテンプレート マッチングが可能になります。
以上が関数定義で「enable_if_t」が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。