2013-04-26 12 views
5

私はいくつかのユーザ定義のイテレータを持っており、すべての今して、私は回避しやすい奇妙なエラーが発生しますが、私はそれを取得していますなぜ私は理解していない:配列要素のアドレスが宣言と誤っているのはなぜですか?

uint8_t bytes[pitch*height]; 

array_iterator::col_iterator a(&bytes[0]); 

array_iterator::row_iterator base_iter_begin(
    array_iterator::col_iterator(&bytes[0]), width, pitch); 

array_iterator::row_iterator base_iter_end(
    array_iterator::col_iterator(&bytes[pitch*height]), width, pitch 
); 

私はクラスを持っていますtypedefs row_iteratorとcol_iteratorが埋め込まれたarray_iteratorと呼ばれます。 row_iteratorコンストラクタは、最初の引数としてcol_iteratorをとります。最初と最後の声明はうまく動作します。

test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references 

が&を書く([]は、&よりも優先順位が高いことから、驚くことではない)(バイト[0])問題が解決しない:中間のステートメントは、次のエラーでコンパイルに失敗します。もちろん、明示的なcol_iteratorコンストラクタ呼び出しに "a"を代用することはできますが、なぜそれを行う必要がありますか?そして、問題がある場合、最後の行のcol_iteratorコンストラクタはなぜコンパイルされますか?

ありがとうございました。

+2

ほとんどのVexing Parseはおそらく? –

+1

問題を再現するa * short *の例を掲載してください。 –

+0

それは最もVexing Parseかもしれませんが、わかりません。 3行目は同じように解析しないでしょうか? static_cast (&bytes [0])は問題を解決しますが、&bytes [0]の前後に括弧を追加するだけで問題は解決しません。申し訳ありませんが、例はまだ蒸留されていませんが、韻や理由なしに問題が発生しているようです(つまり、第3行と第2行とはどのように違うのですか?)。しかし、確かに解析エラーのように見えるので、実際にはrow_iteratorまたはcol_iteratorが何であるかに依存しないと思うでしょう。 – user1806566

答えて

2

まず第一に、我々は次の行に問題を絞り込むことができます。

struct row_iterator { ... }; 
typedef unsigned* col_iterator; 
unsigned bytes[5]; 
row_iterator base_iter_begin(col_iterator(&bytes[0])); 

3行目は次のように理解されています

row_iterator base_iter_begin(col_iterator& bytes[0]); 

そして、もう一つのラインとして取って関数を宣言していますパラメータ:col_iteratorへの0参照の配列。intを返す。コメントに指摘されているのは確かにmost vexing parseです。

それを取り除くための最も簡単な方法ではなく、直接の初期化(C++での初期化)のコピーの初期化を使用することです:

row_iterator base_iter_begin = row_iterator(col_iterator(&bytes[0])); 

あなたの場合には次のようになります。

array_iterator::row_iterator base_iter_begin = array_iterator::row_iterator(array_iterator::col_iterator(&bytes[0]), width, pitch); 

NOTE : C++ 11を使用している場合はeven more initialization rulesがあり、リストの初期化を使用して定型解析と最も厄介な解析の両方を取り除くことができます:

array_iterator::row_iterator base_iter_begin{array_iterator::col_iterator(&bytes[0]), width, pitch};