list里面是自定义的结构:list <SM_TASK> g_taskList;结构如下:
typedef struct __st_SM_TASK
{
int  Number; //话机号码关键字
char Version[20]; //版本号

}SM_TASK;push_back都是正常的,可以加入,如:
SM_TASK m_smTask;
m_smTask.Number=100;
strncpy(m_smTask.Version, "sdfasdf", 20);
g_taskList.push_back(m_smTask);
-------------------------------------------------
现在想删除里面的对象,已经定位到该对象,remove出错:
SM_TASK sm_task;
g_taskList.remove(m_tmpTask);编译错误:
error C2678: binary '==' : no operator defined which takes a left-hand operand of type 'struct __st_SM_TASK' (or there is no acceptable conversion)
....

解决方案 »

  1.   

    重载一个
    SM_TASK的==操作符。
      

  2.   

    我想应该是g_taskList在remove的时候没有办法定位到指定的位置,因为是个结构,对吧
      

  3.   

    bool operator == (SM_TASK& a, SM_TASK& b)
    {
       if(a.Number != b.Number)
          return false;
       return _tcscmp(a.Version,b.Version) == 0;
    }
      

  4.   

    typedef struct __st_SM_TASK
    {
    int  Number; //话机号码关键字
    char Version[20]; //版本号
    bool operator == (const __st_SM_TASK &obj) const {
    for (int i = 0; i < 20; i++) {
    if (Version[i] != obj.Version[20]) return false;
    }
    return Number == obj.Number;
    }
    }SM_TASK;
      

  5.   

    需要重载 ==
    bool operator == (const __st_SM_TASK& task)const
    { return task.Number == this->Number && !strcmp(task.Version,this->Version);}
      

  6.   

    结构是不能用诸如==这种操作符直接比较的,如果非要这样使用的话,需要在__st_SM_TASK里重载下'=='操作符号
      

  7.   

    自定义的类一般都定义== 拷贝构造,默认构造函数, 用在STL向量中更应该定义
      

  8.   

    谢谢各位,等下结帖,还有个问题,怎样把g_taskList的值一个个取出来?
    for (int i=0;i<g_taskList.size();i++)
    {
                //把g_taskList的值怎么取出来?没有看到getitem之类的属性和方法
    }
      

  9.   

    list<int> ls;
    for (int i = 0; i < 5; i++) {
    ls.push_back(i);
    }
    for (list<int>::iterator iter = ls.begin(); iter != ls.end(); iter++) {
    cout << *iter << endl;
    }
      

  10.   

    list<SM_TASK>::iterator iter = g_taskList.begin();
    while(iter != g_taskList.end())
    {
    SM_TASK& one = (SM_TASK&)(*iter);
    iter++;
    }
      

  11.   

    按照小明的写法,我想取完一个值后就删掉:
    list<SM_TASK>::iterator iter = g_taskList.begin();
    while(iter != g_taskList.end())
    {
    SM_TASK& one = (SM_TASK&)(*iter);
                       AttendID = one.Number;
                       g_taskList.remove(one);//我加了这一句,操作符已经重载了
    iter++;
    }
    编译正常,我往list上加了两项,循环时,第一次取值和删除都正常,第二次取值时,运行到
    AttendID = one.Number;出异常错误框debug assretion failed!...
      

  12.   

    你删除一个元素后iter会失效。
      

  13.   

    iter就向一个链表中一个节点的指针。如果你删除了这个节点那么它的指针也就失效了,就找不到下一个节点正确写法。list<SM_TASK>::iterator iter = g_taskList.begin();while(iter != g_taskList.end())
    {
    SM_TASK& one = (SM_TASK&)(*iter);
    AttendID = one.Number;
    ++iter; //在使用跌代器的时候为了提高效率一般都用前置++
    g_taskList.remove(one);//我加了这一句,操作符已经重载了}
      

  14.   

    同意arrow8209(arrow)!
    确实需要用++前置!