【问题标题】:Access to elements of const char *arr[] in a function在函数中访问 c​​onst char *arr[] 的元素
【发布时间】:2019-06-27 14:42:25
【问题描述】:

我正在传入一个指针函数数组,并且想要获取数组的元素。该函数总是返回最后一个元素。为什么?

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

【问题讨论】:

  • 我们可以得到minimal reproducible example 吗?由于代码无法编译,如果我们删除template&lt;&gt; 以使其编译,那么它仍然无法编译。
  • 在我修复了代码使其可以编译后,我无法重现该问题。
  • 嗯..它没有!
  • @NathanOliver 代码已更新。 Test run

标签: c++ pointers constants


【解决方案1】:

这里的问题是您在main 中使用的类型与专业化的类型不匹配。当您调用maxn(arr_cha, 2) 时,编译器会尝试推断参数(它还没有查看特化,因为这仅在推断之后发生)。它推断arr_cha 被定义为char*[]。这与专业化所采用的const char*[] 不匹配,因此从不考虑专业化。相反,编译器将从template&lt;typename T&gt; T maxn(T arr[], int len) 中剔除一个maxn,并将T 推导出为char*

为了让你需要的专业化工作

template<> char * maxn(char *arr[], int len)
{
    return arr[0];  
}

或者,您甚至可以不专门化模板,而是将其重载

char * maxn(char *arr[], int len)
{
    return arr[0];  
}

你会得到同样的结果。

【讨论】:

  • 感谢您的帮助。另一个问题:如果我不想提供更改传递字符串(在函数中)的访问权限并使用 const(const char *arr_cha[]) 声明数组,该怎么办?
  • @DinirImameev 在这种情况下,将使用专业化。因为你有template&lt;typename T&gt; T maxn(T arr[], int len),如果传递给maxn 的类型不完全匹配任何特化或重载,那么它将被选择,因为它会产生完全匹配,而其他一切都需要转换。
猜你喜欢
  • 2021-05-20
  • 1970-01-01
  • 2022-01-25
  • 2012-01-08
  • 2020-11-29
  • 1970-01-01
  • 2014-09-03
  • 2012-04-28
  • 2016-10-01
相关资源
最近更新 更多