C++通用模板
C++ generic template
本文关键字:C++ 更新时间:2023-10-16
大家好,我刚刚开始学习C ++,只是看了模板。我被要求制作一个模板函数打印,该函数将接受一个数组和一个 int 输入并打印出数组中的元素。这是我的代码。
#include <iostream>
using namespace std;
template <typename T>
void print(T a[], int b)
{
for(int y=0; y < b; y++)
{
cout << a[y] <<" ";
}
}
int main()
{
int arr[5];
int size = sizeof(arr);
for(int h=0; h<=size; h++)
{
arr[h]=0;
}
print(arr,size);
}
该程序编译没有错误,但是当我运行它时没有输出。谁能帮忙?还是为我指出正确的方向?
此时
程序具有未定义的行为:
for (int h = 0; h <= size; h++)
{
arr[h] = 0;
}
您将size
定义为数组arr
中保存的字节数,而不是实际存在的整数数。因此,平台上的整数很可能大于 1 个字节,因此size
等于远大于 5 的数字。
当你执行arr[h]
时,你最终将访问一个超出数组边界的地址。正是在这一点上,您的程序会签订未定义行为的情况。此时,程序中的任何事情都可能发生,包括输出未显示。
解决此问题的方法是将arr
中存在的字节除以单个int
的字节大小。这将告诉您元素的数量:
int size = sizeof(arr)/sizeof(int);
更好的解决方案是使用 std::array
,以便已知大小,并可以通过其成员函数访问 size
:
std::array<int, 5> arr{{}};
for (int i = 0; i < arr.size(); ++i)
arr[i] = 0;
请注意,对 std::array
使用聚合初始化会导致每个元素的零初始化。因此,后续的 for 循环没有用处。
您还需要调整您的函数,以便它可以访问数组对象:
template<typename T, unsigned N>
void print(const std::array<T, N>& a)
{
for (const auto& x : a) // range-based for loop
{
std::cout << x;
}
}
错误在于变量 size
的值。
int size = sizeof(arr);
给出数组的大小(以字节为单位),它不是 5。
int size = sizeof(arr)/sizeof(arr[0]);
会给出正确的答案。
添加也是一个好主意
cout << endl;
在主的末尾。
相关文章:
- 没有找到相关文章