2013-04-26 3 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를 사용합니다. 처음과 마지막 문장은 잘 동작합니다. 중간 문은 다음 오류와 함께 컴파일에 실패 :

([] &보다 높은 우선 순위를 가지고 있기 때문에, 당연한) & (바이트 [0]) 문제가 해결되지 쓰기
test-2d-iterators.cc:780: error: declaration of 'bytes' as array of references 

. 물론, 명시 적 col_iterator 생성자 호출을 "a"로 대체 할 수는 있지만 왜해야만합니까? 그리고 문제가있는 경우 마지막 줄의 col_iterator 생성자가 왜 컴파일됩니까?

감사합니다.

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

를 그리고 세 번째 줄은 다음과 같이 이해된다 : 모든

+2

아마도 가장 Vexing Parse일까요? –

+1

문제를 나타내는 a * short * 예제를 게시하십시오. –

+0

그것은 가장 Vexing Parse 일 수 있지만 확실하지 않습니다. 세 번째 줄이 같은 방식으로 해석되지 않습니까? static_cast (& bytes [0])은 문제를 해결하지만, & [0] 주위에 괄호를 추가하는 것만으로는 문제가 해결되지 않습니다. 죄송합니다. 예제가 더 이상 소용이 없지만 문제는 아무런 이유도없이 (즉, 세 번째 줄이 두 번째 줄과 어떻게 다릅니 까?), 그래서 내 시도에 저항했습니다. 그것은 확실히 구문 분석 오류처럼 보이지만, 그래서 그것은 실제로 row_iterator 또는 col_iterator가 무엇인지에 의존하지 않는다고 생각할 것입니다. – user1806566

답변

2

첫째, 우리는 다음과 같은 라인에 문제를 좁힐 수

row_iterator base_iter_begin(col_iterator& bytes[0]); 

그리고 그 하나 개의 라인으로 복용하는 함수를 선언 매개 변수 col_iterator에 대한 0 개의 참조 배열이며 int를 반환합니다. 의견에서 지적한 바와 같이 실제로는 most vexing parse입니다.

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에서 초기화 ++)의 복사 초기화를 사용하는 것입니다 : C++ 11을 사용하고 있다면 even more initialization rules이 있으며 목록 초기화를 사용하여 상용구와 가장 까다로운 구문 분석을 모두 제거 할 수 있습니다.

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