これが可能であれば、構文は次のようにする必要があります
template<int N>
void A<int, N>::func()
{
printf("%d\n", N);
}
つまりT
、テンプレート パラメータ リストには記載されません。
しかし残念ながら、それは不可能です。個々の関数 (メンバー関数を含む) を部分的に特化することはできません。
標準から (部分クラス テンプレートの特殊化に関するセクション):
(§14.5.5/2) 各クラス テンプレートの部分的特殊化は個別のテンプレートであり、定義はテンプレートの部分的特殊化 (14.5.5.3) のメンバーに提供されます。
したがって、あなたの状況では、必要なことを達成するための最も直接的な方法は、クラス テンプレート全体を部分的に特殊化することです。
template<int N>
class A<int,N>
{
public:
void func();
};
template<int N>
void A<int,N>::func()
{
printf("%d\n",3);
}
Coliru でのこの作業例(もちろん、 の定義はfunc
クラス テンプレート定義にインライン化できます。)
ただし、クラス テンプレートに他の多くのメンバーが含まれている場合は、それらをすべて再定義する必要があるため、これは最適ではない可能性があります。
(§14.5.5/3) [...] クラス テンプレートの特殊化は個別のテンプレートです。クラス テンプレートの部分的な特殊化のメンバーは、プライマリ テンプレートのメンバーとは無関係です。定義が必要な方法で使用されるクラス テンプレートの部分的な特殊化メンバーは、定義する必要があります。プライマリ テンプレートのメンバーの定義は、クラス テンプレートの部分的な特殊化のメンバーの定義として使用されることはありません。[...]
場合によっては、この 1 つの関数のみをメンバーとして (他のメンバーへのアクセスが必要ない場合は静的メンバーである可能性があり、アクセスが必要なメンバーを明示的な関数引数として渡す可能性があります)、別のクラス テンプレートを宣言することが望ましい場合があります。実際のクラス テンプレート内からそれを参照します (クラス テンプレート全体を部分的に特殊化する必要がないようにするため)。