2011-12-10 14 views
0

個人用に配列テンプレートを作成しました。テンプレートを使用してアレイを初期化する方法

template <typename T, int size> 
struct Vector { 
    T data[size]; 
}; 

私はそうのようなデータをintializeしようとした:

Vector<unsigned char, 10> test; 
test.data[] = {0,1,2,3,4,5,6,7,8,9}; 

私のコンパイラは何かについて文句終わった "期待される表現を。"誰も私がやっていることを知っていますか?私はこのスタイルの初期化を使用できるようにするには、forループを使用して要素を個別に初期化するのではなく、一度に配列定義全体を渡す必要があります。あなたが唯一のあなたはにそれを定義している時点で配列を初期化することができます

+1

構造体に追加する予定がない限り、普通の古い配列を使う方が良いと思います。 –

答えて

3

クラスが集合体であるので、あなたはいつも括弧構文でそれを初期化することができます。

Vector<int, 3> x = { { 1, 2, 3 } }; 

まったく同じことがstd::array<int, 3>に適用されます。

+0

+1、非常に良い! :) –

0

:あなたの配列があります

Vector<unsigned char, 10> test; 

、あなたはそれを定義して行われ、それを初期化するチャンスが経過しました。

編集:は私にはマットの答え、メモを見て:私はC++ 11をよく読んで、すぐに...するを持っている: -/

編集2:私はちょうど与えました何が間違っていたかに関する情報。 Kerrek SBには、それを正しく行う方法に関する情報があります。 ;-)

+0

私は間違っていたと思うし、あなたは正しい - その構文は初期化専用です... – Mat

0

あなたは、変数を定義する際に、アレイのタイプとサイズを供給しなければならない:

Vector<int, 10> test; 

ます。ただし、通常のアレイ状部材アレイに割り当てることができません。あなたは、各要素を個別に割り当てる必要があり:

for (int i = 0; i < 10; i++) 
    test.data[i] = i; // If instantiated with type "int" 
+0

"メンバー配列には通常の配列のように割り当てることはできません。"もはやC++ 11では真実ではありません。 – jrok

2

新しい標準のC++ 11では、std::initalizer_listを使用して目的の結果を得ることができます。以下の例を参照してください。

#include <iostream> 
#include <algorithm> 

template <typename T, int size> 
struct Vector { 
    T data[size]; 

    Vector<T, size> (std::initializer_list<T> _data) { 
    std::copy (_data.begin(), _data.end(), data); 
    } 
    // ... 

    Vector<T, size>& operator= (std::initializer_list<T> const& _data) { 
    std::copy (_data.begin(), _data.end(), data); 
    return *this; 
    } 
}; 

int 
main (int argc, char *argv[]) 
{ 
    Vector<int, 10> v ({1,2,3,4,5,6}); // std::initializer_list 

    v = {9,8,7,6,5,4,3,2,1,0}; // operator= 
} 

あなたが前にC++ 11に標準で作業している場合、それは本当に面倒をもう少しだし、あなたの最善の策はstd::vectorを使用する際に利用できるものと同様の機能を実装することです。

#include <iostream> 
#include <algorithm> 

template <typename T, int size> 
struct Vector { 
    T _data[size]; 

    Vector (T* begin, T* end) { 
    std::copy (begin, end, _data); 
    } 

    // ... 

    void assign (T* begin, T* end) { 
    std::copy (begin, end, _data); 
    } 
}; 

int 
main (int argc, char *argv[]) 
{ 
    int A1[4] = {1,2,3,4}; 
    int A2[5] = {99,88,77,66,55}; 

    Vector<int, 10> v1 (A1, A1+4); 

    // ... 

    v1.assign (A2, A2+5); 
} 
+0

最初の例はコンパイルされません。 – jrok

+0

@jrokスニペットに何も間違いはありません。私を啓発してください。 –

+0

GCCは次のように述べています。「最初のスニペットの最後の行では、エラー:初期化リストから配列に割り当てます。 – jrok

関連する問題