首页 > C++编程 > 一道关于模板题的思考

一道关于模板题的思考

在C++ Primer 4th Edition上面有这么一个题目:

当调用两个string对象的compare时,传递用字符串字面值初始化的两个string对象。如果编写下面的嗲吗会发生什么?

compare("hi", "world");

 于是我试着写了一下,并没有提示错误。我的compare函数如下:

template<typename T>
int compare(T a, T b)
{
	if(a < b)return -1;
	if(b < a)return 1;
	return 0;
}

 这时候照着书上的代码比了一下,发现我又忘记写const引用了。修改后的代码如下:

template<typename T>
int compare(const T& a, const T& b)
{
	if(a < b)return -1;
	if(b < a)return 1;
	return 0;
}

 这时候再次编译时就出现了错误了,VC6的提示如下:

error C2782: 'int __cdecl compare(const T &,const T &)' : template parameter 'T' is ambiguous

而在GCC 4.5.0中则提示信息更加准确,让人有方向感。

error: no matching function for call to 'compare(const char [3], const char [6])'

 已经看到了,函数参数的类型不匹配(两个参数的类型不一样了)。那为何没加const的时候没错呢?应该就是因为没有加const,估计进行了隐式转换。所以,对于这类函数,一定要注意加上const T&,要不说不定什么时候就会造成程序出错甚至崩溃,却不知道到底错在哪。


觉得文章还不错?点击此处对作者进行打赏!


本文地址: 程序人生 >> 一道关于模板题的思考
作者:代码疯子(Wins0n) 本站内容如无声明均属原创,转载请保留作者信息与原文链接,谢谢!


更多



分类: C++编程 标签: , , ,
  1. bg2bkk
    2014年6月24日00:34 | #1

    不是const的问题,而是引用符合 &的问题

    [回复]

  2. iambic
    2015年4月5日23:32 | #2

    不使用引用的话,会有一个 “array to pointer decay”, 从而const char[N] 会变成char*

    Ref: <>

    [回复]

  1. 本文目前尚无任何 trackbacks 和 pingbacks.