C++ 错误C2664-代码在VC6中编译良好;不在VS 2010中
我有一个typedef,一个使用该类型的成员向量的类,然后是一个使用std:::erase()的方法C++ 错误C2664-代码在VC6中编译良好;不在VS 2010中,c++,stl,C++,Stl,我有一个typedef,一个使用该类型的成员向量的类,然后是一个使用std:::erase()的方法 #typedef DWORD WordNo; 类CWordList:公共对象 { 公众: WordNo_t*begin(){返回m_Words.begin();} WordNo_t*end(){返回m_Words.end();} 无效截断(字编号*Ptr) { 如果(Ptr==end()) 返回; 断言(Ptr>=begin()&&Ptr
#typedef DWORD WordNo;
类CWordList:公共对象
{
公众:
WordNo_t*begin(){返回m_Words.begin();}
WordNo_t*end(){返回m_Words.end();}
无效截断(字编号*Ptr)
{
如果(Ptr==end())
返回;
断言(Ptr>=begin()&&Ptr
详细错误是:错误C2664:'std::_Vector_iterator std::Vector::erase(std:_Vector_const_iterator,std:_Vector_const_iterator)':无法将参数1从'const WordNo_t'转换为'std:_Vector_const_iterator'
非常新的STL。。。任何帮助都将不胜感激。指针不是迭代器
erase
接受迭代器,但您正在向其传递指针。也许您应该更改truncate
以同时使用迭代器?指针不是迭代器erase
接受迭代器,但您正在向其传递指针。也许你应该改变truncate
来同时使用迭代器?我很惊讶begin
和end
甚至都在编译,它们不应该<代码>标准::向量(和朋友)使用迭代器,而不是指针。(尽管他们打算采取类似的行动。)
在任何情况下,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]);
}
我很惊讶
begin
和end
甚至都在编译,他们不应该这样做<代码>标准::向量(和朋友)使用迭代器,而不是指针。(尽管他们打算采取类似的行动。)
在任何情况下,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]);
}
如果你是新来的,拿一个。如果你是新来的,拿一个。谢谢!begin()和end()实际上并没有像上面那样编译,但我找到了这一部分的答案。我只是想发布在VC6中编译的原始代码,并强调我现在遇到问题的特定部分。再次感谢@没问题,如果有什么不对劲,请告诉我。谢谢!begin()和end()实际上并没有像上面那样编译,但我找到了这一部分的答案。我只是想发布在VC6中编译的原始代码,并强调我现在遇到问题的特定部分。再次感谢@没问题,如果有什么不对劲,请告诉我。
void truncate (WordNo_t *Ptr)
{
// note the == end() bit will be in here anyway:
m_Words.erase(to_iterator(Ptr, m_Words), end());
}