首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

C++ templates一书中2.4节basics/max3a.cpp这个例子是不是有有关问题啊

2012-03-19 
C++ templates一书中2.4节basics/max3a.cpp这个例子是不是有问题啊?根据作者的原意,该段程序将会出错,原因

C++ templates一书中2.4节basics/max3a.cpp这个例子是不是有问题啊?
根据作者的原意,该段程序将会出错,原因是对于C-string,   max(a,   b)创建了一个临时的本地变量通过引用返回,在linux上测试,比较三个字符串的调用没有出错,反倒是比较三个整数的函数报错,望各位指教,谢谢。
#include   <iostream>  
#include   <cstring>  
#include   <string>  

//   maximum   of   two   values   of   any   type   (call-by-reference)  
template   <typename   T>  
inline   T   const&   max   (T   const&   a,   T   const&   b)  
{  
        return   a   <   b   ?   b   :   a;  
}  

//   maximum   of   two   C-strings   (call-by-value)  
inline   char   const*   max   (char   const*   a,   char   const*   b)  
{  
        return   std::strcmp(a,b)   <   0   ?   b   :   a;  
}  

//   maximum   of   three   values   of   any   type   (call-by-reference)  
template   <typename   T>  
inline   T   const&   max   (T   const&   a,   T   const&   b,   T   const&   c)  
{  
        return   max   (max(a,b),   c);   //   error,   if   max(a,b)   uses   call-by-value  
}  

int   main   ()  
{  
        ::max(7,   42,   68);   //   OK  

        const   char*   s1   =   "frederic ";  
        const   char*   s2   =   "anica ";  
        const   char*   s3   =   "lucas ";  
        ::max(s1,   s2,   s3);   //   ERROR  

}

[解决办法]
你怎么看的结果,你是由参数传递指针进去的,但你并没有更改比较后的指针
inline char const* max (char * &a, char *&b)这样声明还差不多
在函数内交换或者不交换ab才能正确结果
[解决办法]
编译器给的warning也够清楚了:
21 D:\test\1.cpp [Warning] returning reference to temporary

热点排行