明确的模板专业化

时间:2017-06-10 10:24:12

标签: c++ c++11

这是我的功能模板

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的错误代码..

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)

也使指针参数成为只读 第一个签名允许更改从函数内部作为参数传递的指针。