无法在C ++中为指针向量创建自定义排序

时间:2011-12-21 19:23:23

标签: c++ sorting vector

我正在尝试使用排序谓词为类指针向量创建自定义排序:

struct sort_by_airtime                                                                                            
{                                                                                                                 
    inline bool operator() (const Network *n1, const Network *n2)                                                 
    {                                                                                                             
      return (n1->airtime() < n2->airtime());                                                                     
    }                                                                                                             
};      

对于每个网络,我们按照airtime()返回的浮点数进行排序。

现在,我尝试使用如下:

std::vector<Network *> Simulator::sort_networks(std::vector<Network *> netlist, bool sort_airtime) {

  std::vector<Network *> new_netlist = netlist;

  if(sort_airtime) {
    sort(new_netlist.begin(), new_netlist.end(), sort_by_airtime());
  }

}

但是,我遇到了很多这样的错误:

In file included from Simulator.cpp:7:
Simulator.h: In member function ‘bool Simulator::sort_by_airtime::operator()(const Network*, const Network*)’:
Simulator.h:48: error: passing ‘const Network’ as ‘this’ argument of ‘virtual float Network::airtime()’ discards qualifiers
Simulator.h:48: error: passing ‘const Network’ as ‘this’ argument of ‘virtual float Network::airtime()’ discards qualifiers

我没有正确指定传递给谓词的参数吗? airtime()由继承Network类的类实现。

3 个答案:

答案 0 :(得分:5)

编译器警告您Network::airtime()忽略了constn1上的n2限定符。

解决方案是创建const的“Network::airtime() - 正确”版本(假设它实际上没有修改任何内容)。

有关示例,请参阅this answer

答案 1 :(得分:3)

您的成员函数应声明为const成员函数:

virtual float Network::airtime() const 
                                 ^^^^^ //this makes the function const

因为您在operator()中使用的指针指向const类型的Network个对象。

答案 2 :(得分:1)

Network::airtime()不是const,因此无法通过const Network*中的sort_by_airtime来调用。

如果可能,最好的解决方案是使airtime() const;否则将sort_by_airtime参数更改为Network*