標準から簡潔な引用を見つけようとしましたが、それはないと思います。実際には、テンプレート関数(または、さらに言えば、テンプレートエイリアス)の部分的な特殊化などはありません。クラステンプレートのみが部分的な特殊化を持つことができます。
テンプレートについては少し忘れましょう。C ++では、クラス名と関数名に大きな違いがあります。特定のスコープ内に存在できるクラスの定義は1つだけです。(さまざまな宣言を行うことができますが、それらはすべてOne True Classを参照します。)したがって、名前は実際にクラスを識別します。
一方、関数名は一種のグループIDです。スコープ内でまったく同じ名前の関数をいくつでも定義できます。関数名を使用して関数を呼び出す場合、コンパイラーは、さまざまな可能性を調べ、それぞれのシグニチャーを指定された引数と照合することにより、実際にどの関数を意味しているかを把握する必要があります。名前を共有するさまざまな機能の間に関係はありません。それらは完全に別個のエンティティです。
だから、大したことはありません。あなたはこれをすべて知っていましたね?しかし、テンプレートに戻りましょう。
テンプレート化されたクラスの名前はまだ一意です。部分的な特殊化を定義することはできますが、同じテンプレートクラスを明示的に特殊化する必要があります。このメカニズムは、表面的には上記の関数名解決アルゴリズムに似ていますが、大きな違いがあります。その1つは、関数プロトタイプとは異なり、同じスコープ内に異なる種類のテンプレートパラメーターを持つ2つのクラステンプレートを使用できないことです。
一方、テンプレート化された関数は、一意の名前を定義する必要はありません。テンプレートは、通常の機能のオーバーロードメカニズムに置き換わるものではありません。したがって、コンパイラが関数名の意味を理解しようとするときは、その関数名のすべてのテンプレート化された宣言とテンプレート化されていない宣言を考慮し、テンプレート化された宣言を一連のテンプレートパラメータ割り当てに解決してから(可能であれば)、一度それを実行する必要があります。可能な関数オブジェクトのリストがあります。通常の過負荷解決で最適なものを選択してください。
これは、テンプレート化されたクラステンプレートパラメータの解決とはまったく異なるアルゴリズムです。提供されたテンプレート引数のリストを宣言されたテンプレートパラメータのリストと照合するだけでなく、クラステンプレートを解決する方法であるため、一致する可能性のある各テンプレート関数を取得する必要があります(たとえば、少なくとも適切な数のパラメータがあります)。 ; 提供された引数をテンプレートと統合することにより、テンプレートパラメータを推測します。次に、オーバーロード解決のさらなるラウンドのために、オーバーロードセットに解決スペシャライゼーションを追加します。
そのプロセスに部分的な特殊化の解決策を追加することも可能だったと思いますが、部分的な特殊化と関数のオーバーロードの間の相互作用は、疑似魔法の動作につながる可能性が高いと思います。イベントでは、それは必要ではなかったので、そのようなメカニズムはありません。(関数テンプレートを完全に特殊化できます。完全に特殊化すると、推測するテンプレート引数がないため、問題はありません。)
これがスクープです。テンプレート化された関数を部分的に特殊化することはできませんが、同じ名前の関数テンプレートをいくつでも提供することを妨げるものは何もありません。それらはすべて過負荷解決で考慮され、通常どおり、最良のものが勝ちます。
通常、それは実際にはオーバーロードのニーズには十分です。テンプレート化された関数については、通常の関数と同じように考える必要があります。提供された引数に基づいて、必要な関数を選択する方法を考えてください。推論するのではなく、関数呼び出しでテンプレートパラメータを指定する必要があると思われる場合は、関数をテンプレート化されたクラスの(おそらく静的な)メンバーにして、テンプレート引数をクラスに指定します。
お役に立てば幸いです...