《C++ Primer第6版》第8章第6题模板问题:为何输出最后而非最长字符串
问题原因分析与修复方案
我一眼就揪出问题啦——你的模板特化版本根本没被调用到!下面给你拆解细节:
核心问题:类型不匹配导致特化失效
你在main里定义的字符串数组是:
const char *arr_3[4] = { "sdf","tttq","ttttrrsdss" ,"q12221"};
当把它传给Maxn函数时,这个数组会退化为**const char**类型的指针**。但你写的模板特化是这样的:
template <> char * Maxn<>(char **p, int n) { ... }
这里的参数是char**,和const char**完全不匹配!编译器找不到对应的特化版本,就自动调用了通用的template <typename T> T Maxn(T *,int)模板。
通用模板对指针的错误处理
通用模板里的逻辑是if (p[i] > max),对于指针类型来说,这个比较的是指针的内存地址大小,而不是字符串的长度!因为数组里的字符串字面量是按顺序存储的,最后一个元素的地址通常是最大的,所以通用模板会返回最后一个字符串,这就是你看到的错误结果。
修复方案
把特化版本的参数类型改成const char**,同时返回值也要对应const char*(因为原数组是const的,返回非const指针会有类型风险,也不符合C++的类型安全原则):
// 修改后的特化版本 template <> const char * Maxn<>(const char **p, int n) { const char *max = p[0]; for (int i = 0; i < n; i++) { if (strlen(p[i]) > strlen(max)) { max = p[i]; } } return max; }
测试一下修改后的代码,就能正确返回最长的字符串"ttttrrsdss"啦!
内容的提问来源于stack exchange,提问作者Youshikyou
相关产品推荐
相关产品推荐

