错误C2664 - 代码在VC6中编译良好;不在VS 2010中

时间:2010-07-23 08:00:09

标签: c++ stl

我有一个typedef,一个使用该类型的成员向量的类,然后是一个使用std ::< vector> :: 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&lt; _Myvec&gt; std :: vector&lt; _Ty&gt; :: erase(std :: _ Vector_const_iterator&lt; _Myvec&gt;,std :: _ Vector_const_iterator&lt; _Myvec&gt;)':无法将参数1从'const WordNo_t'转换为'std :: _ Vector_const_iterator&lt; _Myvec&gt;'

STL很新......任何帮助都会受到赞赏。

2 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:2)

我很惊讶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(第一个元素)的元素&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());
}