这是我的功能模板
template<class T> const T& min(const T& a, const T& b) {
return (a < b) ? a : b;
}
函数的唯一目的是返回两个参数的最小值。这些论点是只读的。
这是char * arguments
的显式特化//Code 1:
template<>
const char*& min<const char*>(const char* &a,
const char* &b) {
return (strcmp(a, b) < 0) ? a : b;
}
即使只读参数,此代码也会出错。虽然下面的代码完美无缺
//Code 2:
template<>
const char* const& min<const char*>(const char* const& a,
const char* const& b) {
return (strcmp(a, b) < 0) ? a : b;
}
为什么我必须在 char * 之后提供 const&amp; ,如果&amp; 或 const 就足够了使参数只读。代码2中的 const&amp; 是什么意思.. ??
编辑:
我在使用Code 1编译时收到此错误代码。
error: template-id 'min<const char*>' for 'const char* const& min(const char*&, const char*&)' does not match any template declaration|
虽然没有编译代码2的错误代码..
答案 0 :(得分:2)
在你的第一份声明中
template<class T> const T& min(const T& a, const T& b) {...}
const T&
实际上等同于T const &
,即对常量T
的引用。如果你想专门化那个函数,它仍然需要引用一个常量某些东西。如果你想专门研究const char*
(与char const *
相同,即指向常量char
的指针),你需要写:char const * const &
,即对常量char
的常量指针的引用。
通常,const
总是指向左侧写入的内容,只有当const
本身位于最开头时,它才会指向其右侧写入的内容。
附录(偏离主题,这并不能解释实际问题):
您可以重载min
:
const char* min(const char* a, const char* b) {
return (strcmp(a, b) < 0) ? a : b;
}
答案 1 :(得分:1)
char*
实际上有两种不同的专精。
第一个签名
const char* const& min<const char*>(const char* &a,
const char* &b)
使值指向只读。而第二个
const char* const& min<const char*>(const char* const& a,
const char* const& b)
也使指针参数成为只读 第一个签名允许更改从函数内部作为参数传递的指针。