模板参数const问题,输出竟然不一样

Fire_Sky_Ho 2017-07-16 05:41:46
#include <iostream>
#include<cstring>
using namespace std;
template<typename T>
T maxn ( T *a, const int n )
{
for ( int i = 0; i < n; i++ )
if ( a[i] > a[0] ) a[0] = a[i];
return a[0];
}
template<> const char* maxn( const char **a, const int n )
{
int i,j=0;
for(i=0;i<n;i++)
if(strlen(a[i])>strlen(a[j])) j=i;
return a[j];

}

int main()
{
int a[6] = {5, 7, 3, 6, 8, 0};
double b[4] = {1.1, 2.2, 0.1, 1.01};
const char *c[5] = {"Fuck", "Fuck you", "Fuck you now", "Fuck you and mother", "Fuck me"};
cout << maxn ( a, 6 ) << endl;
cout << maxn ( b, 4 ) << endl;
cout << maxn ( c, 5 ) << endl;

return 0;
}

第三个输出是Fuck you and mother
我把template<> const char* maxn( const char **a, const int n ) const去掉template<> char* maxn( char **a, const int n )
输出是Fuck me
为什么啊
还有template<> const char* maxn<const char* >( const char **a, const int n )中的<const char* >作用是什么
...全文
213 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
Fire_Sky_Ho 2017-07-18
  • 打赏
  • 举报
回复
引用 5 楼 sdghchj 的回复:
[quote=引用 4 楼 Fire_Sky_Ho 的回复:] [quote=引用 1 楼 sdghchj的回复:]模板匹配的原则是寻找所有可能的匹配并使用最佳(最匹配的,最接近的,最特化版的)匹配。 带const的是优先匹配带const的,下面函数如果是const char** ,它就与const char* c[]最匹配,否则,上面的模板T类型就被推导为最匹配的cconst char*。如果匹配上面的函数,而a[i]代表的字符串的首地址,自然是数组里最后一个字符串的地址最大。
最后一个问题呢,第一个我知道了[/quote] 最后一个问题是啥? char* 正常情况下是指向可修改的字符数组的,比如char* p = new char[10]; 或者char str[10]; char* p= str; 而const char* 表示不能通过该指针修改它所指向的字符数组或字符串,经常用来指向字面常量字符串。 像"XXXXX"这类的常量字符串,是不能修改的字符串,默认情况下只能匹配到到const char*,要强制转换才能匹配到char*但是是不安全的代码。 简单例子strcpy的原型:char* strcpy(char* pdest, const char* pSrc); 为什么后一个参数要加const??,如果不加const,就不能传字面常量字符串而必须进行不安全的强制转换。 [/quote]还有template<> const char* maxn<const char* >( const char **a, const int n )中的<const char* >作用是什么,是干啥的
sdghchj 2017-07-18
  • 打赏
  • 举报
回复
引用 6 楼 Fire_Sky_Ho 的回复:
[quote=引用 5 楼 sdghchj 的回复:] [quote=引用 4 楼 Fire_Sky_Ho 的回复:] [quote=引用 1 楼 sdghchj的回复:]模板匹配的原则是寻找所有可能的匹配并使用最佳(最匹配的,最接近的,最特化版的)匹配。 带const的是优先匹配带const的,下面函数如果是const char** ,它就与const char* c[]最匹配,否则,上面的模板T类型就被推导为最匹配的cconst char*。如果匹配上面的函数,而a[i]代表的字符串的首地址,自然是数组里最后一个字符串的地址最大。
最后一个问题呢,第一个我知道了[/quote] 最后一个问题是啥? char* 正常情况下是指向可修改的字符数组的,比如char* p = new char[10]; 或者char str[10]; char* p= str; 而const char* 表示不能通过该指针修改它所指向的字符数组或字符串,经常用来指向字面常量字符串。 像"XXXXX"这类的常量字符串,是不能修改的字符串,默认情况下只能匹配到到const char*,要强制转换才能匹配到char*但是是不安全的代码。 简单例子strcpy的原型:char* strcpy(char* pdest, const char* pSrc); 为什么后一个参数要加const??,如果不加const,就不能传字面常量字符串而必须进行不安全的强制转换。 [/quote]还有template<> const char* maxn<const char* >( const char **a, const int n )中的<const char* >作用是什么,是干啥的[/quote] template<> const char* maxn( const char **a, const int n ); 是对 template<typename T> T maxn ( T *a, const int n ); 的特化版本。 如果有const char*类型参数的对应函数,则优先使用template<> const char* maxn( const char **a, const int n );的实现。
jena_wy 2017-07-17
  • 打赏
  • 举报
回复
Fuck you and mother的strlen最大
sdghchj 2017-07-17
  • 打赏
  • 举报
回复
引用 4 楼 Fire_Sky_Ho 的回复:
[quote=引用 1 楼 sdghchj的回复:]模板匹配的原则是寻找所有可能的匹配并使用最佳(最匹配的,最接近的,最特化版的)匹配。 带const的是优先匹配带const的,下面函数如果是const char** ,它就与const char* c[]最匹配,否则,上面的模板T类型就被推导为最匹配的cconst char*。如果匹配上面的函数,而a[i]代表的字符串的首地址,自然是数组里最后一个字符串的地址最大。
最后一个问题呢,第一个我知道了[/quote] 最后一个问题是啥? char* 正常情况下是指向可修改的字符数组的,比如char* p = new char[10]; 或者char str[10]; char* p= str; 而const char* 表示不能通过该指针修改它所指向的字符数组或字符串,经常用来指向字面常量字符串。 像"XXXXX"这类的常量字符串,是不能修改的字符串,默认情况下只能匹配到到const char*,要强制转换才能匹配到char*但是是不安全的代码。 简单例子strcpy的原型:char* strcpy(char* pdest, const char* pSrc); 为什么后一个参数要加const??,如果不加const,就不能传字面常量字符串而必须进行不安全的强制转换。
Fire_Sky_Ho 2017-07-17
  • 打赏
  • 举报
回复
引用 1 楼 sdghchj的回复:
模板匹配的原则是寻找所有可能的匹配并使用最佳(最匹配的,最接近的,最特化版的)匹配。 带const的是优先匹配带const的,下面函数如果是const char** ,它就与const char* c[]最匹配,否则,上面的模板T类型就被推导为最匹配的cconst char*。如果匹配上面的函数,而a[i]代表的字符串的首地址,自然是数组里最后一个字符串的地址最大。
最后一个问题呢,第一个我知道了
幻夢之葉 2017-07-17
  • 打赏
  • 举报
回复
去掉const的特化的版本不能匹配你的参数,所以使用了非特化的版本,比较的将会是地址 最后一个的地址最大,所以就输出了最后一个字符串
sdghchj 2017-07-16
  • 打赏
  • 举报
回复
模板匹配的原则是寻找所有可能的匹配并使用最佳(最匹配的,最接近的,最特化版的)匹配。 带const的是优先匹配带const的,下面函数如果是const char** ,它就与const char* c[]最匹配,否则,上面的模板T类型就被推导为最匹配的cconst char*。如果匹配上面的函数,而a[i]代表的字符串的首地址,自然是数组里最后一个字符串的地址最大。

64,636

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧