2013-04-26 33 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 
); 

我有一個類稱爲array_iterator,內嵌typedefs row_iterator和col_iterator。 row_iterator構造函數將col_iterator作爲其第一個參數。第一個和最後一個聲明工作得很好。中間語句失敗,錯誤如下進行編譯:

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

寫作&(字節[0])不解決問題(這並不奇怪,因爲[]的優先級高於&)。當然,我可以用「a」代替顯式的col_iterator構造函數調用,但爲什麼我必須?如果出現問題,爲什麼最後一行中的col_iterator構造函數會被編譯?

謝謝。

+2

最煩人的解析也許? – 2013-04-26 01:52:12

+1

發佈可重現問題的* short *示例。 – 2013-04-26 02:20:57

+0

它可能是最煩人的解析,但我不確定。第三行不會以同樣的方式解析嗎? static_cast (&bytes [0])解決了這個問題,但只是在&bytes [0]周圍添加parens不會。對不起,這個例子並沒有更多提煉出來,但問題似乎沒有任何韻律或理由(即第三行與第二行不同),所以它抵制了我的嘗試。不過,它看起來像一個分析錯誤,所以我認爲它不依賴於row_iterator或col_iterator的實際內容。 – user1806566 2013-04-26 03:10:41

回答

2

首先,我們可以將問題縮小到下面幾行:

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

第三行被理解爲:

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); 

注意:假設你使用C++ 11,有even more initialization rules,你可以使用列表初始化來擺脫樣板和最令人頭疼的解析:

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