#include <string>
//注意:引用参数
template<typename T>
inline T const& max(T const& a, T const& b)
{
return a < b ? b : a;}
int main()
{
string s;}
::max("apple", "peach"); //OK:相同类型的实参
::max("apple", "tomato"); //ERROR:不同类型的实参
::max("apple", s); //ERROR:不同类型的实参
问题在于:由于长度的区别,这些字符串属于不同的数组类型。
也就是说,“apple”,“peach”具有相同的类型char const[6],而“tomato”的类型则是char const[7],因此只有第一个调用是合法的。
然而如果声明是的非引用参数,就可以使用不同的字符串来作为max()的参数:
#include <string>
//注意:非引用参数
如果你遇到一个关于字符数组和字符串指针之间不匹配的问题,你会意外地发现和这个问题一定会有相似指出,然而遗憾的是,对于这个问题并没有通用的解决方法,根据不同的情况,可以采用以下几种方式:template<typename T>产生这种调用结果的原因是:对于非引用类型的参数,在实参演绎的过程中,会出现数组到指针的类型转换
inline T max(T a, T b)
{
return a < b ? b : a;
}
int main()
{
string s;
::max("apple", "peach"); //OK:相同类型的实参
::max("apple", "tomato"); //OK:退化为相同的类型
::max("apple", s); //ERROR:不同类型的实参
}
- 使用非引用参数取代引用参数(然而,这可能会导致无用的拷贝)
- 进行重载,编写接收引用参数和非引用参数的两个重载函数(然而,这可能会导致二义性)
- 对具体类型进行重载
- 强制应用程序员使用显式类型转化