Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/146.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 错误C2664-代码在VC6中编译良好;不在VS 2010中_C++_Stl - Fatal编程技术网

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

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,一个使用该类型的成员向量的类,然后是一个使用std:::erase()的方法

#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());
}