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;

在主的末尾。

相关文章:
  • 没有找到相关文章