【问题标题】:error C2440: 'initializing' : cannot convert from 'std::_Vector_iterator<_Ty,_Alloc>' to 'type *'错误 C2440:“正在初始化”:无法从“std::_Vector_iterator<_Ty,_Alloc>”转换为“类型 *”
【发布时间】:2010-11-01 17:15:21
【问题描述】:

在将 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
}

【问题讨论】:

    标签: c++ visual-studio-2008 iterator porting visual-c++-6


    【解决方案1】:

    如果它以前有效,我猜 MUX_NOTIFICATION_VECTOR 是 typedef

    typedef std::vector<STRUCT_MUX_NOTIFICATION> MUX_NOTIFICATION_VECTOR;
    

    容器的迭代器经常被误认为是指针(因为它的工作方式相同),在某些 stl 实现的情况下,它实际上可以是指针(VC6 提供的 STL 可能就是这种情况) )。但不能保证这一点。

    你应该做的是:

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

    【讨论】:

    • 是的,它是一个 Typedef... 你的声明是完美的。你的推理似乎是正确的。 +1。除非有人有更详细的解释,否则标记为正确答案。谢谢 Benoit。
    【解决方案2】:

    我认为这应该可以解决问题:

       STRUCT_MUX_NOTIFICATION *pstMuxNotfn = &(*MuxNotfnIterator);
    

    【讨论】:

    • +1 有效。但是我仍然需要一个答案,为什么它以前有效,为什么现在无效。其实具体的。我还读到,从 VC7 开始,STL 中的迭代器发生了重大变化。
    • 如果您的代码之前不正确,则会出现“破坏性”更改 - 就像假设向量迭代器是指针一样。 VC6 并不完全符合 C++98 标准(如果只是因为它比它大几个月)。 VC7 更贴近标准,此外还增加了额外的调试选项。更智能的迭代器会有所帮助。这些仍然符合标准要求,但更容易被滥用。
    【解决方案3】:

    您需要取消对迭代器的引用以获得适当的结构(不知道为什么它以前有效?):

    STRUCT_MUX_NOTIFICATION *pstMuxNotfn = *MuxNotfnIterator;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-01-22
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多