2013-02-28 3 views
0

이 멤버 함수를 가진 클래스가 있습니다.역 참조 대 배열 액세스

void AddTo(vertex** vrtList) { 
    if(*vrtList != 0) { 
    *vrtList->m_vrtLast = this; 
    } 
    m_vrtNext = *vrtList; // save existing list, if any 
    m_vrtLast = 0; 
    *vrtList = this; 
} 

gcc는 오류 메시지를 표시합니다. 내가 vrtList[0]->m_vrtLast*vrtList->m_vrtLast 교체 할 경우

error: request for member ‘m_vrtLast’ in ‘* vrtList’, which is of non-class type ‘vertex*’

는, 컴파일러는 그것을 받아들이고, 코드는 잘 작동합니다.

버그 (gcc) 또는 기능 (C/C++)이 맞습니까?

+7

'(* vrtList) -> m_vrtLast'는 원하는 것을 할 수있는 더 좋은 기회를 제공 할 수 있습니다. 그리고 아니오, 버그가 아닙니다. 그 우선 순위 문제. – WhozCraig

+0

* vrtList-> m_vrtLast를 vrtList-> m_vrtLast로 바꾸십시오. – user1929959

+0

정확합니다. 마찬가지로 vrtList [0]. 그래서 메시지는 접미사 연산자가 접두사 연산자보다 우선한다는 것입니다. 기능이 아니라 버그. –

답변

2

우선 순위는 operator*입니다.

*vrtList->m_vrtLast(*vrtList)->m_vrtLast과 동일하지 않고 *(m_vrtList->m_vertLast)과 동일합니다.

따라서 괄호를 적절하게 추가해야합니다.

3

이것은 버그가 아니지만, operator precedence이 원인입니다. -> 연산자는 *보다 우선하므로 *vrtList->m_vrtLast*(vrtList->m_vrtLast)과 같으므로 의도 한 바가 아닙니다.

[]->은 왼쪽에서 오른쪽으로 읽음으로써 -> 전에 []이 발생합니다.

[] 또는 (*vrtList)->m_vrtLast을 사용하십시오.

+1

그가 원하는 것을 위해 (* vrtList)가 유일한 올바른 방법입니다. vrtList [0]은 나쁜 습관입니다. –