ошибка C2440: «инициализация»: невозможно преобразовать из «std::_Vector_iterator‹_Ty,_Alloc›» в «тип *»

Я получаю следующую ошибку при переносе кода VC6 на VS2008. Этот код отлично работает в VC6, но выдает ошибку компиляции в VC9. Я знаю, что это из-за нарушения компилятора. В чем проблема и как ее исправить?

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
}

person bobbyalex    schedule 10.06.2009    source источник


Ответы (3)


Если это работало раньше, я предполагаю, что MUX_NOTIFICATION_VECTOR - это typedef

typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR;

Итератор для контейнера часто можно спутать с указателем (поскольку он работает так же), и в случае некоторых реализаций stl он может быть указателем (вероятно, это было в случае с STL, поставляемым с VC6). Но гарантии на этот счет нет.

Вам следует сделать следующее:

STRUCT_MUX_NOTIFICATION& reference = *MuxNotfnIterator;
// or
STRUCT_MUX_NOTIFICATION* pointer = &(*MuxNotfnIterator);
person Benoît    schedule 10.06.2009
comment
Да, это Typedef... и ваша декларация идеальна. Ваши рассуждения кажутся правильными. +1. Пометка как правильный ответ, если у кого-то нет более подробного объяснения. Спасибо Бенуа. - person bobbyalex; 10.06.2009

Я думаю, что это должно сделать трюк:

   STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator);
person The Dark    schedule 10.06.2009
comment
+1, как это работает. Но мне все еще нужен ответ, почему это работало раньше и почему не сейчас. Специфика на самом деле. Я также читал, что в STL есть критические изменения в отношении итераторов, начиная с VC7. - person bobbyalex; 10.06.2009
comment
Есть критические изменения, если ваш код раньше был неправильным - например, если предположить, что векторные итераторы являются указателями. VC6 не совсем соответствовал стандарту C++98 (хотя бы потому, что он на несколько месяцев старше). VC7 более точно соответствует стандарту и, кроме того, добавляет дополнительные параметры отладки. Умные итераторы помогают. Они по-прежнему соответствуют стандартным требованиям, но более устойчивы к злоупотреблениям. - person MSalters; 10.06.2009

Вам нужно будет разыменовать итератор, чтобы получить соответствующую структуру (не знаю, почему это работало раньше?):

STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator;
person arul    schedule 10.06.2009