【发布时间】:2013-05-22 12:04:32
【问题描述】:
这是 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 不会编译这段代码并给出如下错误:
错误:没有匹配函数调用 'compare(const char [4], const 字符 [5])'
注意:候选是:模板 int compare(const T&, 常量 T&)
现在给出以下事实:
我。字符串字面量,或 C++ 中的 C 风格字符串实际上是一个 const 字符数组.
二。如果作为普通的非引用类型传递,则数组将是 悄悄地转换为指向其第一个元素的指针。
这里我只是将字符串文字“abc”和“defg”作为reference 传递给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& 传递字符串文字?
【问题讨论】:
-
您的第二个比较重载看起来像您的第一个 - 都采用 const char * - 编辑?
-
"然后再次编译失败" - 对我来说适用于 clang 和 g++。
-
"abc","defg"不是const char* -
@很快我再次尝试了“然后编译再次失败”并且它工作......问题已编辑