【问题标题】:error C2664 - code compiles fine in VC6; not in VS 2010错误 C2664 - 代码在 VC6 中编译良好;不在 VS 2010 中
【发布时间】:2010-07-23 08:00:08
【问题描述】:

我有一个 typedef,一个具有使用该类型的成员向量的类,然后是一个使用 std::::erase() 的方法。

#typedef DWORD WordNo_t;

class CWordList : public CObject
{
public:
WordNo_t* begin() { return m_Words.begin(); }
WordNo_t* end()   { return m_Words.end(); }
void truncate (WordNo_t *Ptr)
{
  if (Ptr == end())
    return;
  ASSERT (Ptr >= begin() && Ptr < end());
  // following line generates C2664
  m_Words.erase (Ptr, end());
}

private:
  std:vector<WordNo_t> m_Words;
}

详细的错误是:
错误 C2664:“std::_Vector_iterator<_myvec> std::vector<_ty>::erase(std::_Vector_const_iterator<_myvec>,std::_Vector_const_iterator<_myvec>)”:无法将参数 1 从“const WordNo_t”转换为'std::_Vector_const_iterator<_myvec>'

对 STL 很陌生...任何帮助将不胜感激。

【问题讨论】:

标签: c++ stl


【解决方案1】:

我很惊讶 beginend 甚至正在编译,他们不应该。 std::vector(和朋友)使用迭代器,而不是指针。 (虽然它们的目的是相似的。)

无论如何,erase 接受一个迭代器,而不是一个指针。由于向量是连续的,因此您可以这样创建实用函数:

template <typename T, typename A>
typename std::vector<T, A>::iterator
to_iterator(T* pPtr, std::vector<T, A>& pVec)
{
    ASSERT(pPtr >= &pVec.front() && pPtr <= &pVec.back());

    return pVec.begin() + (pPtr- &pVec[0]);
}

template <typename T, typename A>
typename std::vector<T, A>::const_iterator
to_iterator(const T* pPtr, const std::vector<T, A>& pVec)
{
    ASSERT(pPtr >= &pVec.front() && pPtr <= &pVec.back());

    return pVec.begin() + (pPtr - &pVec[0]);
}

基本上,找出pPtr 中有多少元素来自&amp;pVec[0](第一个元素),然后将其添加到pVec.begin()。 (将指针的偏移量和要开始的指针转换为从开始的偏移量。)这个操作是O(1)。然后:

void truncate (WordNo_t *Ptr)
{
    // note the == end() bit will be in here anyway:
    m_Words.erase(to_iterator(Ptr, m_Words), end());
}

【讨论】:

  • 谢谢! begin() 和 end() 实际上没有像上面那样编译,但我找到了那部分的答案。我只是想我会发布在 VC6 中编译的原始代码,并突出显示我现在遇到问题的特定部分。再次感谢!
  • @paorear:没问题,如果有什么不明白的地方请告诉我。
【解决方案2】:

指针不是迭代器。 erase 接受一个迭代器,但您传递给它一个指针。或许您应该更改 truncate 以也采用迭代器?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-09-26
    • 2018-08-14
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-16
    • 1970-01-01
    相关资源
    最近更新 更多