gpt4 book ai didi

C++ 泛型模板

转载 作者:行者123 更新时间:2023-11-27 23:11:30 24 4
gpt4 key购买 nike

大家好,我刚刚开始学习 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);

}

程序编译没有错误,但是当我运行它时却没有输出。谁能帮忙?或者指出正确的方向?

最佳答案

你的程序有 Undefined Behavior此时:

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;

注意使用aggregate-initializationstd::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;
}
}

关于C++ 泛型模板,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20019749/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com