这是来自于C++ Primer, 4th edition, Chapter 16的一个例子,它涉及到模板特化。
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无法编译此代码并给出以下错误:
现在考虑以下事实:error: no matching function for call to 'compare(const char [4], const char [5])'
note: candidate is: template int compare(const T&, const T&)
我只是将字符串字面值"abc"和"defg"作为const char*的引用传递,并期望它们首先被转换为I. 字符串字面值,在C++中被称为C风格字符串,实际上是一个const char数组。
II. 如果作为普通非引用类型传递,数组将被静默地转换为指向其第一个元素的指针。
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);
}
那么问题出现在哪里呢? 为什么我不能通过参数类型const char * const&
在模板专业化版本中传递字符串字面量呢?
然后g++就可以愉快的编译了。
const char*
。 - Avraam Mavridis