c++ - 尝试使用 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;
}
解决方案
您将固定数组传递给实际上不接受固定数组作为输入的函数。因此,您的数组将衰减为指向第一个元素的指针,导致函数将其模板参数推断为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;
}
推荐阅读
- java - Java JPA 处理具有唯一约束冲突的“创建”
- php - 将类添加到在 the_content()
- fortran - 在分配 LOGICAL(C_BOOL) 变量时使用 gfortran 进行编译警告
- jquery - 检查文本以创建事件
- sql - 在 SQL 中每 7 天重复周末的模式
- python - 如何使用 Matplotlib 绘制带有时间戳的实时数据
- python - 适用于 Python 3 的 Kivy 启动器
- ios - React-Native 上 iOS 调试模式下的离线捆绑
- python - 使用 python 从 SNS 主题 ARN 获取 SNS 主题名称
- amazon-web-services - 我有一个 PowerShell 脚本,用于检查 1 个 AWS 账户的 ACM 状态。如何在不使用 IAM 密钥的情况下为多个 AWS 账户扩展它?