我要传递一个函数指针数组,并希望采用该数组的元素。函数始终返回最后一个元素。为什么?
#include <iostream>
#include <cstring>
using namespace std;
template<typename T> T maxn(T [], int);
template<> const char * maxn(const char *[], int);
int main(int argc, char const *argv[])
{
char *arr_cha[] = {new char[4], new char[5]};
strcpy(arr_cha[0], "abc");
strcpy(arr_cha[1], "abcd");
cout << arr_cha[1] << endl;
cout << maxn(arr_cha, 2) << endl;
return 0;
}
template<typename T> T maxn(T arr[], int len)
{
T max = arr[0];
for(int i=1;i<len;i++){
max = max < arr[i] ? arr[i] : max;
}
return max;
}
template<> const char * maxn(const char *arr[], int len)
{
return arr[0];
}
控制台:
abcd
abcd
当我不在堆上分配字符串时,一切正常。
示例:
char str1[] = "abc";
char str2[] = "abcd";
char *arr_cha[] = {str1, str2};
答案 0 :(得分:0)
这里的问题是您在main
中使用的类型与专业化类型不匹配。当您调用maxn(arr_cha, 2)
时,编译器将尝试推导参数(它尚未考虑专业化,因为它仅在推导之后发生)。它推论arr_cha
被定义为char*[]
。这与专业化所采用的const char*[]
不匹配,因此从不考虑专业化。取而代之的是,编译器将从maxn
中剔除template<typename T> T maxn(T arr[], int len)
,并将T
推导为char*
。
为了使专业化发挥作用,您需要
template<> char * maxn(char *arr[], int len)
{
return arr[0];
}
或者,您甚至无法专门化模板,而是使用
char * maxn(char *arr[], int len)
{
return arr[0];
}
您将获得相同的结果。