2009-06-10 5 views
0

VC6 코드를 VS2008로 마이그레이션하는 동안 다음 오류가 발생합니다. 이 코드는 VC6에서 제대로 작동하지만 VC9에서 컴파일 오류를 발생시킵니다. 나는 그것이 컴파일러를 깨뜨린 변화 때문이라고 생각한다. 문제점은 무엇이며 해결 방법은 무엇입니까?오류 C2440 : '초기화 중': 'std :: _ Vector_iterator <_Ty,_Alloc>'을 'type *'으로 변환 할 수 없습니다.

error C2440: 'initializing' : cannot convert 
    from 'std::_Vector_iterator<_Ty,_Alloc>' 
     to 'STRUCT_MUX_NOTIFICATION *' 

코드

MUX_NOTIFICATION_VECTOR::iterator MuxNotfnIterator; 

for(
    MuxNotfnIterator = m_MuxNotfnCache.m_MuxNotificationVector.begin(); 
    MuxNotfnIterator != m_MuxNotfnCache.m_MuxNotificationVector.end(); 
    MuxNotfnIterator ++ 
    ) 
{ 
    STRUCT_MUX_NOTIFICATION *pstMuxNotfn = MuxNotfnIterator; //Error 2440 
} 

답변

8

orked 전에, 내가 추측하고 MUX_NOTIFICATION_VECTOR은 실제로 할 수있는 일부 STL과 구현의 경우, (이 같은 방식으로 작동하기 때문에)와 컨테이너의 반복자는 종종 포인터로 오인 될 수

typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR; 

형식 정의입니다 포인터 여야합니다 (VCL과 함께 제공되는 STL의 경우 일 수 있습니다). 그러나 그것에 대한 보장은 없습니다. 내 가설이 정확

STRUCT_MUX_NOTIFICATION& reference = *MuxNotfnIterator; 
// or 
STRUCT_MUX_NOTIFICATION* pointer = &(*MuxNotfnIterator); 
+0

네, Typedef입니다 ... 당신의 선언은 완벽합니다. 추론이 정확하다고 보입니다. +1. 좀 더 자세한 설명이없는 한 올바른 대답으로 표시하십시오. 감사합니다. – bobbyalex

1

(그 전에 일을 왜 확실하지?) 당신은 반복자가 적절한 구조체를 얻는 역 참조해야합니다 :

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator; 
+0

경우 제안 무엇을 작동하지 않습니다

은 당신이해야 할 것은이 다음이다. –

4

난이 어떻게해야한다고 생각 속임수 :

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator); 
+0

+1이 작동합니다. 그러나 나는 왜 그것이 이전에 효과가 있고 왜 지금은 효과가 없는지에 대한 대답이 필요합니다. 실제로 세부 사항. VC7 이후의 이터레이터와 관련하여 STL의 주요 변경 사항이 있음을 읽었습니다. – bobbyalex

+0

코드가 올바르지 않은 경우 "반복적 인"변경이 있습니다. 벡터 반복자가 포인터라고 가정합니다. VC6은 C++ 98 표준과 정확하게 일치하지 않았습니다 (단지 몇 달 오래 되었기 때문에). VC7은 표준에 더욱 밀접하게 부합하며, 추가로 디버깅 옵션을 추가합니다. 더 똑똑한 반복자가 도움이됩니다. 그것들은 여전히 ​​표준 요구 사항을 충족 시키지만, 남용에 더욱 강력합니다. – MSalters