这是C++ Primer,第 4 版,第 16 章中的一个示例,它是关于模板专业化的。
#include <iostream>
#include <string>
#include <cstring>
using namespace std;
template <class T>
int compare(const T& v1, const T& v2) {
if(v1<v2) return -1;
if(v2<v1) return 1;
return 0;
}
template <>
int compare<const char*>(const char* const &v1, const char* const &v2){
return strcmp(v1,v2);
}
int main(int argc, const char *argv[])
{
cout << compare("abc","defg") << endl;
return 0;
}
我希望compare("abc","defg")
会调用模板的专用版本。但事实是,g++ 4.6.3 不会编译这段代码并给出以下错误:
错误:没有用于调用“比较(const char [4],const char [5])”的匹配函数
注意:候选是:模板 int compare(const T&, const T&)
现在给出以下事实:
I. 字符串字面量,或 C++ 中的 C 风格字符串实际上是一个const char array。
二、如果作为普通的非引用类型传递,数组将被悄悄地转换为指向其第一个元素的指针。
在这里,我只是将字符串文字“abc”和“defg”作为对 的引用传递 const char*
,我希望它们会先转换为const char*
,然后通过引用传递。但似乎 g++ 不同意我的观点,拒绝编译代码。
但是如果我用函数重载替换模板特化,也就是替换
template <>
int compare<const char*>(const char* const &v1, const char* const &v2){
return strcmp(v1,v2);
}
和
int compare(const char* const& v1, const char* const& v2){
return strcmp(v1,v2);
}
然后 g++ 会很乐意编译它。
那么问题到底出在哪里呢?为什么我不能 const char* const&
在模板专业化版本中按参数类型传递字符串文字?