gpt4 book ai didi

c++ - 错误 C2664 - 代码在 VC6 中编译正常;不在 VS 2010 中

转载 作者:行者123 更新时间:2023-11-27 23:33:09 26 4
gpt4 key购买 nike

我有一个 typedef,一个包含使用该类型的成员 vector 的类,然后是一个使用 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 的新手...任何帮助将不胜感激。

最佳答案

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

无论如何,erase 接受一个迭代器,而不是一个指针。因为 vector 是连续的,所以你可以这样创建效用函数:

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]);
}

基本上,从 &pVec[0](第一个元素)中找出 pPtr 有多少个元素,然后将其添加到 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());
}

关于c++ - 错误 C2664 - 代码在 VC6 中编译正常;不在 VS 2010 中,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3316335/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com