関数テンプレートの検索における ADL エラー
C では、引数依存検索 (ADL) により、関数テンプレート内の関数名の宣言を検索できます。関数呼び出しの引数に関連付けられた名前空間。ただし、関数テンプレートと ADL に関しては、C 仕様に制限があります。
制限
C 標準 14.8.1.6 によると、ADL は次のことを行いません。呼び出し時に同じ名前の表示可能な関数テンプレートがない限り、関数テンプレートに適用されます。これは、明示的なテンプレート引数を持つ関数テンプレートの場合、呼び出しには、表示される関数テンプレートを使用した正しい構文形式が必要であることを意味します。
例
次の例を考えてみましょう。
namespace ns { struct foo {}; template<int i> void frob(foo const&) {} void non_template(foo const&) {} } int main() { ns::foo f; non_template(f); // This is fine. frob<0>(f); // This is not. }
この例では、ADL は最初の呼び出しで non_template を見つけて解決します。は普通の関数です。ただし、2 番目の呼び出しでは、frob は関数テンプレートです。呼び出しの時点で可視の frob 関数テンプレートがないため、ADL は失敗し、呼び出しは構文的に整形式ではありません。
制限への対処
この制限を克服するには、関数テンプレートが呼び出しのスコープ内で確実に表示されるようにしてください。これは、現在の名前空間で関数テンプレートを宣言するか、関数テンプレートを含む名前空間で呼び出しを修飾することによって実現できます。
以上がC 関数テンプレートで引数依存検索 (ADL) が失敗するのはなぜですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。