の最初の使用ではstrcpy_s、配列内の要素の数はszTempタイプの一部であるためszTemp(「512の配列TCHAR」であるため)、コンパイラはそれを認識し、を宣言するテンプレートを完成させることができますstrcpy_s。
の2番目の使用法ではstrcpy_s、pszTempはポインタ(「へのポインタTCHAR」)であり、配列ではなく、ポイントされる要素の数は型の一部ではありません。一般に、コンパイラーは、ポインターが指す場所にある要素の数を知ることができません。(この場合、前のコードが示しているので、コンパイラーはそれを推測するかもしれませんが、それはコンパイラーと一般的に実装する価値がないと見なされる言語に複雑さを追加します。)
これを自分で行うには、次のように宣言された方法でテンプレートstrcpy_sを宣言します。
template <size_t size> errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
);
これは、パラメーターに基づいてテンプレートを宣言します。テンプレートは、最初のパラメーターのタイプが「の要素のsize配列への参照」である関数用です。コンパイラは、charの512要素の配列である最初の引数での使用を確認すると、この引数をテンプレートのパラメータに一致させることができ、512であると推測します。sizecharstrcpy_ssize
他の場所では、(宣言だけでなく)テンプレートの定義があります。sizeその定義では、コードでテンプレートパラメータを使用できます。コンパイラがの使用を確認すると、 512strcpy_sの特殊化でテンプレート定義をインスタンス化します。size
Cにはテンプレートがないため、これはCではなくC++でのみ機能します。