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