在函数中访问const char * arr []的元素

时间:2019-06-27 14:42:25

标签: c++ pointers const

我要传递一个函数指针数组,并希望采用该数组的元素。函数始终返回最后一个元素。为什么?

#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};

1 个答案:

答案 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];  
}

您将获得相同的结果。