ホームページ > バックエンド開発 > C++ > テンプレート引数で「enable_if_t」を使用すると再定義エラーが発生するのはなぜですか?

テンプレート引数で「enable_if_t」を使用すると再定義エラーが発生するのはなぜですか?

Linda Hamilton
リリース: 2024-11-12 10:08:02
オリジナル
341 人が閲覧しました

Why Does Using `enable_if_t` in Template Arguments Lead to Redefinition Errors?

テンプレート引数の enable_if_t が再定義エラーを引き起こす理由

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 番目のテンプレート引数のデフォルト値が異なっていても、テンプレートは依然として同じ型の templatevoid() です。これは、異なるデフォルトの int 値を持つ 2 つの関数 print(string, int) を持つことと同じであり、これはオーバーロードには無効です。

この問題を解決するには、テンプレート引数の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 サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート