编译模板类报错

nero_liu 2010-06-12 01:21:20
在main入口函数里我先用模板类的insert插入一个Entity,然后删除。可是编译报错了,报错的位置就是delete方法里,位置我已经标明在代码里。

错误信息

错误 1 error C2664: “std::list<_Ty>::_Iterator<_Secure_validation> std::list<_Ty>::erase(std::list<_Ty>::_Const_iterator<true>)”: 不能将参数 1 从“Entity”转换为“std::list<_Ty>::_Const_iterator<_Secure_validation>” c:\users\nero\documents\visual studio 2008\projects\ttest\ttest\tlink.h 58 tTest




#include <list>

using namespace std;

class Entity
{
public:
char *Name;
int Age;
bool operator==(const Entity& cEqual) const
{
return strcmp(Name,cEqual.Name)==0 && cEqual.Age== Age;
}

};

template <typename T>
class TLink
{
public:
void Insert(T t);
void Delete(T t);
void Empty();
int GetCount();
TLink(void);
~TLink();
private:
list<T> *m_list;

};



template <typename T>
TLink<T>::TLink(void)
{
m_list=new list<T>;
//m_list->push_back()
}
template <typename T>
TLink<T>::~TLink()
{
delete m_list;
}
template <typename T>
void TLink<T>::Insert(T t)
{
m_list->push_back(t);
}
template <typename T>
void TLink<T>::Delete(T t)
{
list<T>::iterator iter;
for (iter=m_list->begin();iter!=m_list->end();iter++)
{
if ((T)*iter==t)
{
//这里编译报错了
m_list->erase(t);
}
else
{
iter++;
}
}

}
template <typename T>
int TLink<T>::GetCount()
{
return m_list->size();
}
template <typename T>
void TLink<T>::Empty()
{
m_list->clear();
}

...全文
119 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
pengzhixi 2010-06-12
  • 打赏
  • 举报
回复
ite=m_list->erase(ite);//要注意迭代器失效的问题
nero_liu 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 stjay 的回复:]
引用 3 楼 nero_liu 的回复:
引用 1 楼 taodm 的回复:
m_list->erase(iter);
另外,即使改成这样还是错的。你得去看《effective stl》了

谢谢,这样是可以的


意思是改成m_list->erase(iter);
但算法上还是错的,因为erase后iter就无效了,不能iter++
[/Quote]
改成这样就可以了
template <typename T>
void TLink<T>::Delete(T t)
{
list<T>::iterator iter;
for (iter=m_list->begin();iter!=m_list->end();)
{
if (*iter==t)
{
//这里编译报错了
//m_list->erase(iter);
iter = m_list->erase(iter);
}
else
{
iter++;
}
}

}
pengzhixi 2010-06-12
  • 打赏
  • 举报
回复

template <typename T>
void TLink<T>::Delete(T t)
{
typename list<T>::iterator iter;//mark
for (iter=m_list->begin();iter!=m_list->end();iter++)
{
if ((T)*iter==t)
{
//这里编译报错了
m_list->erase(t);
}
else
{
iter++;
}
}

}
stjay 2010-06-12
  • 打赏
  • 举报
回复
如果list元素唯一的话
可以直接break出来
stjay 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 nero_liu 的回复:]
引用 1 楼 taodm 的回复:
m_list->erase(iter);
另外,即使改成这样还是错的。你得去看《effective stl》了

谢谢,这样是可以的
[/Quote]

意思是改成m_list->erase(iter);
但算法上还是错的,因为erase后iter就无效了,不能iter++
z569362161 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
m_list->erase(iter);
另外,即使改成这样还是错的。你得去看《effective stl》了
[/Quote]

你没明白taodm的意思
nero_liu 2010-06-12
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 taodm 的回复:]
m_list->erase(iter);
另外,即使改成这样还是错的。你得去看《effective stl》了
[/Quote]
谢谢,这样是可以的
  • 打赏
  • 举报
回复
if ((T)*iter==t)
你*iter 就是T类型为什么还要强制转化。。。
taodm 2010-06-12
  • 打赏
  • 举报
回复
m_list->erase(iter);
另外,即使改成这样还是错的。你得去看《effective stl》了

64,631

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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