试图使用int []作为打字模板,编译器未识别函数最小的原型中的参数



我正在撞墙。该代码应该使用类型模板并在我的功能中实现。前两个原型功能按预期工作。第三个原型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;
}

您的模板参数T1被推论为int*。因此,您的功能最小在编译器中看起来像这样:

int* min(int* dataValue)
{
    int* minimum;
    minimum = dataValue[0]; // dataValue[0] is an int

如果将min的声明更改为:

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

然后将T1推论为int

您将固定数组传递给实际上不接受固定数组作为输入的函数。因此,您的数组将 decay 对第一个元素的指针,从而导致函数将其模板参数推断为int*,并且有关数组实际大小的所有信息都将丢失。如果您将数组更改为不同的尺寸,则还必须更新功能。您想避免。

尝试使用此功能,这允许函数采用固定数组AS,并将正确推导其大小:

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

实时演示

int data0[10];

是10 int s的数组,因此在

template<typename T1>
T1 min(T1 dataValue)

data0将衰减到指针,并为T1提供int*的类型。这意味着

T1 minimum;

int * minimum;

指向int的指针,这意味着

minimum = dataValue[0];

试图将单个整数dataValue[0]分配给指针minimum。其余错误相似。

快速黑客修复:从模板扣除删除指针

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

最新更新