gpt4 book ai didi

c++ - 将 2d std::array 传递给函数 cpp

转载 作者:行者123 更新时间:2023-11-30 02:30:05 28 4
gpt4 key购买 nike

我正在尝试用 C++ 编写一个函数,它将采用 2 个输入 std::arrays,并通过矩阵乘法返回一个乘积数组。但是,该函数不能采用不同维度的数组(例如 4x4 有效,3x4 无效)

这是代码:

#include <iostream> 
#include <array>


template <std::size_t SIZE>
void dot(std::array<std::array<double, SIZE>, SIZE>& array1,
std::array<std::array<double, SIZE>, SIZE>& array2)
{
int x1 = array1.size();
int y1 = array1[0].size();


int x2 = array2.size();
int y2 = array2[0].size();
}

int main()
{
using std::array;
array<array<double, 4>, 4> syn0 = {{ {1,2,4},
{2,3,4},
{6,8,6},
{1,2,4} }};
dot(syn0, syn0);
return 0;
}

使用此 question 中提出的模板示例, 它将像代码中那样接受数组,例如 4x4。

将矩阵更改为不相等的数字会产生以下错误:

newer.cpp: In function ‘int main()’:
newer.cpp:23:21: error: too many initializers for ‘std::__array_traits<std::array<double, 4ul>, 3ul>::_Type {aka std::array<double, 4ul> [3]}’
{1,2,4} }};
^
newer.cpp:24:17: error: no matching function for call to ‘dot(std::array<std::array<double, 4ul>, 3ul>&, std::array<std::array<double, 4ul>, 3ul>&)’
dot(syn0, syn0);
^
newer.cpp:24:17: note: candidate is:
newer.cpp:6:6: note: template<long unsigned int SIZE> void dot(std::array<std::array<double, SIZE>, SIZE>&, std::array<std::array<double, SIZE>, SIZE>&)
void dot(std::array<std::array<double, SIZE>, SIZE>& array1,
^
newer.cpp:6:6: note: template argument deduction/substitution failed:
newer.cpp:24:17: note: deduced conflicting values for non-type parameter ‘SIZE’ (‘4ul’ and ‘3ul’)
dot(syn0, syn0);
^
newer.cpp:24:17: note: ‘std::array<std::array<double, 4ul>, 3ul>’ is not derived from ‘std::array<std::array<double, SIZE>, SIZE>

我假设这样做的原因是模板只分配一个变量,所以如果我将 2 分配给同一个变量,它会抛出错误。我测试过是否可以为两个不同的变量堆叠模板,但这是不可能的。

我怎样才能允许该函数采用任意大小的二维数组而不导致该错误?

最佳答案

看来你们真的很亲密。

您只需将 SIZE2 作为参数添加到您的模板中:

template <std::size_t SIZE,std::size_t SIZE2>
void dot(std::array<std::array<double, SIZE>, SIZE2>& array1,
std::array<std::array<double, SIZE>, SIZE2>& array2)

并且编译正常顺便说一句,你的 syn0 大小是错误的

int main()
{
using std::array;
array<array<double, 3>, 4> syn0 = {{ {1,2,4},
{2,3,4},
{6,8,6},
{1,2,4} }};
dot(syn0, syn0);
return 0;
}

关于c++ - 将 2d std::array 传递给函数 cpp,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38984790/

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