テンプレート引数推論の失敗: 推論されないコンテキストを理解する
コード内で、次のことを目的とした 2 つの関数 (temp と temp2) を定義しました。パラメータのタイプに基づいてテンプレート引数を推測します。ただし、これらの引数を推定できないことを示すコンパイラ エラーが発生します。
この問題は、関数定義での typename キーワードの使用に起因します。
// Example 1 template <class A> A temp(typename S<A>::type a1) // Example 2 template <class A, class B> B temp2(typename S<A>::type a1, B a2)
テンプレート テンプレート パラメーターを使用する場合, typename は、テンプレート クラス内の依存名を参照するために必要です。ただし、これは関数のコンテキストでは当てはまりません。S::type は単に非依存型です。
C では、テンプレート パラメーターが で使用されるときにテンプレート引数の推定が発生します。そのタイプを決定するコンテキスト。ただし、この例では、テンプレート パラメーター A は、参照型の宣言でのみ出現するため、非推定コンテキストで使用されます。
typedef typename T& type;
その結果、コンパイラーはテンプレート引数を次から推定できません。関数呼び出し。この問題を解決するには、次の関数を呼び出すときにテンプレート引数を明示的に指定する必要があります。
temp<char>(c);
明示的な引数を指定すると、コンパイラは適切な型でテンプレートを正しくインスタンス化できます。
以上がC テンプレートの引数推定が非推定コンテキストで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。