首页 > 解决方案 > 尝试使用 int[] 作为类型名模板,编译器无法识别函数 min 原型中的参数

问题描述

我正在撞墙。这段代码假设使用类型名模板并在我的函数中实现它们。前两个原型函数按预期工作。第三个原型 min 给我带来了麻烦。假设返回传递的数组中的最小值。但是,看起来好像我没有正确声明模板以与数组一起使用。

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

标签: c++arraystemplates

解决方案


您将固定数组传递给实际上不接受固定数组作为输入的函数。因此,您的数组将衰减为指向第一个元素的指针,导致函数将其模板参数推断为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;
}

现场演示


推荐阅读