在第一次使用时strcpy_s,数组中元素的数量szTemp是类型的一部分szTemp(因为它是一个“512的数组TCHAR”),所以编译器知道它并可以完成声明的模板strcpy_s。
在第二种用法中strcpy_s, ,pszTemp是一个指针(它是一个“指向 ” 的指针TCHAR),而不是一个数组,指向的元素数量不是类型的一部分。通常,编译器无法知道指针指向的位置有多少元素。(在这种情况下,编译器可能会推导出它,因为前面的代码显示了它,但这增加了编译器和通常被认为不值得实现的语言的复杂性。)
要自己执行此操作,请按照声明的方式声明模板strcpy_s:
template <size_t size> errno_t strcpy_s(
char (&strDestination)[size],
const char *strSource
);
这声明了一个基于 parameter的模板,该模板用于一个函数,其第一个参数的类型为“引用元素size数组”。当编译器看到第一个参数是 char 的 512 个元素的数组的使用时,它能够将此参数与模板中的参数相匹配,并推断为 512。sizecharstrcpy_ssize
在其他地方,您将拥有模板的定义(不仅仅是声明)。size该定义可以在其代码中使用模板参数。当编译器看到 的使用时strcpy_s,它将以size512 的特化实例化模板定义。
这仅适用于 C++,不适用于 C,因为 C 没有模板。