Доступ к элементам const char * arr [] в функции - PullRequest
0 голосов
/ 27 июня 2019

Я передаю в массив функций указатели и хочу взять элемент массива.Функция всегда возвращает последний элемент.Почему?

#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 голосов
/ 28 июня 2019

Проблема в том, что тип, который вы используете в 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];  
}

и вы получите те же результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...