テンプレート引数の推論と非推論コンテキスト
C では、テンプレート引数の推論により、コンパイラは型に基づいてテンプレート パラメータの型を決定できます。テンプレート関数またはクラスに渡される引数の数。ただし、このメカニズムは、推定されていないコンテキストを含む特定のシナリオでは失敗する可能性があります。
次のコード スニペットを考えてみましょう:
template <class T> struct S { typedef T& type; }; template <class A> A temp(S<A>::type a1) { return a1; } template <class A, class B> B temp2(S<A>::type a1, B a2) { return a1 + a2; }
ここで、S 構造体は、型への参照を取得する方法として機能します。これはテンプレート パラメータ A によって保持されます。ただし、以下に示すように、整数値を使用してこれらの関数を呼び出そうとすると、コンパイラは次のように報告します。エラー:
int main() { char c = 6; int d = 7; int res = temp(c); int res2 = temp2(d, 7); }
エラー メッセージ:
説明:
この問題は、A の型が非推定コンテキストでのみ使用されるために発生します。つまり、コンパイラーは引数から A を推論できません。関数に渡されます。特に、Sgt;::type は、ネストされたテンプレート型内に表示され、temp または temp2 の引数に直接関連していないため、推定されていないとみなされます。
解決策:
この問題を解決し、テンプレート引数の推論を有効にするには、次に示すように、関数を呼び出すときに A の型を明示的に指定する必要があります。以下:
temp<char>(c);
この明示的な仕様により、コンパイラーは A の型を決定し、テンプレート関数を正常にインスタンス化できます。
以上がテンプレート引数の推論が推論されていないコンテキストで失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。