Попытка использовать int [] в качестве шаблона имени типа, компилятор не распознает аргумент в прототипе для функции min - PullRequest
1 голос
/ 15 марта 2019

Я бью стену.Предполагается, что этот код использует шаблоны typename и реализует их в моих функциях.Первые две функции-прототипы работают по назначению.Третий прототип, мин, доставляет мне неприятности.Предполагается вернуть самое низкое значение в переданном массиве.Однако может показаться, что я не объявил шаблон должным образом для работы с массивом.

<!-- language: lang-none -->
Error   C2440   '=': cannot convert from 'int' to 'T1'  Project6    56  
Error   C2446   '<': no conversion from 'T1' to 'int'   Project6    60  
Error   C2440   '=': cannot convert from 'int' to 'T1'  Project6    62  

#include <iostream>
#include <ctime> // used for rand

template<typename T>
void assignRandom(T dataValue); // fills array with random values

template<typename T>
void print(T dataValue); // outputs array

template<typename T1>
T1 min(T1 dataValue); // identifies lowest value within array

using namespace std;

int main()
{
    srand((unsigned int)time(NULL));
    int data0[10];

    assignRandom(data0);
    cout << "Array of integer: ";
    print(data0);
    cout << min(data0);

    return 0;
}

template<typename T>
void assignRandom(T dataValue)
{
    for (int i = 0; i < 10; i++)
    {
        dataValue[i] = rand() % 10 + 1;
    }

    return;
}

template<typename T>
void print(T dataValue)
{
    for (int i = 0; i < 10; i++)
    {
        cout << dataValue[i] << " ";
    }
    cout << endl;

    return;
}

template<typename T1>
T1 min(T1 dataValue)
{
    T1 minimum;

    minimum = dataValue[0];

    for (int i = 0; i < 10; i++)
    {
        if (dataValue[i] < minimum)
        {
            minimum = dataValue[i];
        }
    }

    return minimum;
}

Ответы [ 3 ]

1 голос
/ 15 марта 2019

Вы передаете фиксированный массив функциям, которые фактически не принимают фиксированный массив в качестве входных данных. Таким образом, ваш массив будет распадаться на указатель на первый элемент, в результате чего функции будут выводить свой параметр шаблона как int*, и вся информация о фактическом размере массива будет потеряна. Если вы когда-нибудь измените свой массив на другой размер, вам также придется обновить функции. Вы хотите избежать этого.

Попробуйте это вместо этого, что позволит функциям принимать фиксированный массив как есть и будет правильно определять его размер:

#include <iostream>
#include <ctime> // used for rand

template<typename T, size_t N>
void assignRandom(T (&dataValue)[N]); // fills array with random values

template<typename T, size_t N>
void print(T (&dataValue)[N]); // outputs array

template<typename T, size_t N>
T min(T (&dataValue)[N]); // identifies lowest value within array

using namespace std;

int main()
{
    srand((unsigned int)time(NULL));
    int data0[10];

    assignRandom(data0);
    cout << "Array of integer: ";
    print(data0);
    cout << min(data0);

    return 0;
}

template<typename T, size_t>
void assignRandom(T (&dataValue)[N])
{
    for (int i = 0; i < N; i++)
    {
        dataValue[i] = rand() % 10 + 1;
    }
}

template<typename T, size_t N>
void print(T (&dataValue)[N])
{
    for (int i = 0; i < N; i++)
    {
        cout << dataValue[i] << " ";
    }
    cout << endl;
}

template<typename T, size_t N>
T min(T (&dataValue)[N])
{
    T minimum = dataValue[0];

    for (int i = 1; i < N; i++)
    {
        if (dataValue[i] < minimum)
        {
            minimum = dataValue[i];
        }
    }

    return minimum;
}

Live Demo

1 голос
/ 15 марта 2019

Ваш аргумент шаблона T1 выводится как int*. Итак, ваша функция min выглядит следующим образом для компилятора:

int* min(int* dataValue)
{
    int* minimum;

    minimum = dataValue[0]; // dataValue[0] is an int

Если вы измените декларацию min на:

template<typename T1>
T1 min(T1* dataValue)

тогда T1 будет выведено как int.

0 голосов
/ 15 марта 2019
int data0[10];

- это массив из 10 int с, поэтому в

template<typename T1>
T1 min(T1 dataValue)

data0 будет затухать до указателя и предоставлять тип int* для T1.Это означает, что

T1 minimum;

является

int * minimum;

указателем на int, и это означает, что

minimum = dataValue[0];

пытается назначить одно целое число, dataValue[0] к указателю minimum.Остальные ошибки аналогичны.

Быстрое исправление взлома: уберите указатель с шаблона вывода

template<typename T1>
T1 min(T1 * dataValue); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...