一个list错误

djhdu 2004-03-29 09:13:24
我有一个如下的函数,一直提示错误,其中m_ElementList为std::list<CElement *>
CElement* CRow::GetPrevElement(const CElement* pElement) const
{
CElement* pPrevElement = NULL;
std::list<CElement*>::iterator Element_iter;

if(pElement)
{
Element_iter = find(m_ElementList.begin(), m_ElementList.end(), (CElement*)pElement);
if(Element_iter!=m_ElementList.end()) //错误行
{
if (Element_iter!=m_ElementList.begin())
return *(--Element_iter);
}
}

return pPrevElement;
}

错误信息error C2678: binary '!=' : no operator defined which takes a left-hand operand of type 'class std::list<class CElement *,class std::allocator<class CElement *> >::iterator' (or there is no acceptable conversion),这是什么原因引起的,如何解决呢?
...全文
53 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
Lemon_2000 2004-04-01
  • 打赏
  • 举报
回复
上面还是有一个bug,楼主原来的逻辑是对的。

std::list<CElement*>::const_iterator Element_iter;

if(pElement)
{
Element_iter = std::find<std::list<CElement*>::const_iterator,
const CElement*>(m_ElementList.begin(), m_ElementList.end(), pElement);

if ( Element_iter != m_ElementList.end()&&Element_iter!=m_ElementList.begin() )
return (*--Element_iter);
}

return NULL;
Lemon_2000 2004-03-31
  • 打赏
  • 举报
回复
基本同意wingfiring(别逗了) ,但 CElement* CRow::GetPrevElement(const CElement* pElement) const
后面有个const, 并不意味着m_ElementList也是const的,它只说明本函数不会改变类的成员。

CElement* CRow::GetPrevElement(const CElement* pElement) const
{
std::list<CElement*>::const_iterator Element_iter;

if(pElement)
{
Element_iter = std::find<std::list<CElement*>::const_iterator,
const CElement*>(m_ElementList.begin(), m_ElementList.end(), pElement);

if (Element_iter!=m_ElementList.begin())
return (*--Element_iter);
}

return NULL;
}
djhdu 2004-03-30
  • 打赏
  • 举报
回复
楼上的兄弟啊,谢谢你,这句return *(--Element_iter);我的目的就是返回要查找的上一个数值啊
Bruceleexiaokan 2004-03-30
  • 打赏
  • 举报
回复
不好意思,有一个bug,修改如下:

typedef std::set <CElement *> Element_Set;
Element_Set my_set (m_ElementList.begin(), m_ElementList.end ());
Element_Set::iterator iter = my_set.low_bound (pElement);
if (iter == m_ElementList.end ())
return NULL;
if ((*iter) == pElement)
{
if (iter == m_ElementList.begin())
return NULL;
return *--iter;
}
return *iter;
wingfiring 2004-03-30
  • 打赏
  • 举报
回复
看这一行:
CElement* CRow::GetPrevElement(const CElement* pElement) const
后面有个const, 意味着m_ElementList也是const的。
m_ElementList.end()只能返回一个const_iterator的类型,看错误信息,应该是没有定义const_iterator和iterator之间的比较运算符。
你可以改一改:
std::list<CElement*>::const_iterator Element_iter;

另外,你这个代码里有明显的逻辑错误,返回之前,pPrevElement根本就没有被更新成查找到的值。
Bruceleexiaokan 2004-03-30
  • 打赏
  • 举报
回复
一个简单的实现:
typedef std::set <CElement *> Element_Set;
Element_Set my_set (m_ElementList.begin(), m_ElementList.end ());
Element_Set::iterator iter = my_set.low_bound (pElement);
if ((iter == ElementList.end ()) ||
(iter == ElementList.begin ()))
return NULL;
if ((*iter) == pElement)
return *--iter;
return iter;
yjh1982 2004-03-30
  • 打赏
  • 举报
回复
*Element_iter
djhdu 2004-03-30
  • 打赏
  • 举报
回复
我要比较CElement*指针值
wingfiring 2004-03-30
  • 打赏
  • 举报
回复
看漏了:(
Lemon_2000 2004-03-29
  • 打赏
  • 举报
回复
sorry,是 Element_iter!=m_ElementList.end() 没有问题。
Lemon_2000 2004-03-29
  • 打赏
  • 举报
回复
Element_iter == m_ElementList.end() 应该没有问题,但find好象有问题,我不知你要比的是 CElement*指针值,还是CElement对象。

// TEMPLATE FUNCTION find
template<class _InIt,
class _Ty> inline
_InIt find(_InIt _First, _InIt _Last, const _Ty& _Val)
{ // find first matching _Val
for (; _First != _Last; ++_First)
if (*_First == _Val)
break;
return (_First);
}
Quain 2004-03-29
  • 打赏
  • 举报
回复
我没有试过,你可以试试,好像是"!="操作符没有被重载定义过,你用
( Element_iter == m_ElementList.end() )== FALSE试试吧,但愿可以,呵呵

24,854

社区成员

发帖
与我相关
我的任务
社区描述
C/C++ 工具平台和程序库
社区管理员
  • 工具平台和程序库社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧