将2d std::数组传递给函数cpp 我试图在C++中编写一个函数,它将输入2个输入STD::数组,并通过矩阵乘法返回产品的数组。但是,该函数不能接受具有不同维度的数组(例如,4x4工作,3x4不工作)

将2d std::数组传递给函数cpp 我试图在C++中编写一个函数,它将输入2个输入STD::数组,并通过矩阵乘法返回产品的数组。但是,该函数不能接受具有不同维度的数组(例如,4x4工作,3x4不工作) ,c++,arrays,c++11,C++,Arrays,C++11,代码如下: #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

代码如下:

#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;
}
#包括
#include,它将接受代码中类似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>
newer.cpp:在函数“int main()”中:
更新的.cpp:23:21:错误:“std::_数组_特征::_Type{aka std::array[3]}”的初始值设定项太多
{1,2,4} }};
^
更新的.cpp:24:17:错误:对“点(std::数组&,std::数组&)”的调用没有匹配函数
点(syn0,syn0);
^
更新。cpp:24:17:注:候选人是:
更新的.cpp:6:6:注意:模板空点(std::array&,std::array&)
空点(标准::阵列和阵列1,
^
更新的.cpp:6:6:注意:模板参数扣除/替换失败:
更新的.cpp:24:17:注意:非类型参数'SIZE'('4ul'和'3ul'的推断值冲突)
点(syn0,syn0);
^
更新的.cpp:24:17:注意:“std::array”不是从“std::array”派生的
我假设这样做的原因是模板只分配了一个变量,所以如果我给同一个变量分配了2个变量,它就会抛出错误。我测试了是否可以为两个不同的变量堆叠模板,但这是不可能的


我怎样才能允许函数获取任意大小的2d数组而不导致该错误?

看来您已经非常接近了

您只需将
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)

很抱歉,我会更新代码。那是我测试是否可以传递第二个模板变量。因此,假设两个数组的大小完全不同(例如,2x4和3x7)我必须使用模板创建4个不同的变量来解释每个不同的值吗?有道理,是的。我不明白为什么不。好的,谢谢你快速的回答。工作非常完美。
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;
}