2016-08-16 7 views
1

私は、2つの入力std :: arraysを受け取り、行列乗算によって積の配列を返す関数をC++で作成しようとしています。しかし、ここで関数は、異なる寸法を持つ配列を取ることができない(例4×4作品、3×4にはありません。)
2d std :: arrayを関数cppに渡す

コードは次のとおり

#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を割り当てた場合、それがスローということであると仮定しますエラー。私は2つの異なる変数のテンプレートをスタックできるかどうかを調べましたが、それは不可能です。

どのようにして関数が任意のサイズの2次元配列を取ることができますが、そのエラーは発生しませんか?

+0

おっとごめん病気のアップデートをコード間違っていたコンパイルします。それは私が2番目のテンプレート変数を渡すことができるかどうかをテストしていました。 –

答えて

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; 
} 
+0

2つの配列が完全に異なる2つのサイズ(例えば、2x4と3x7)であると仮定すると、テンプレートを使用してそれぞれ異なる値を扱うために4つの異なる変数を作成する必要がありますか? –

+0

は意味があります。私はなぜそうは思わない。 –

+0

素早く答えてくれてありがとう。完璧に動作します。 –