2013-05-03 108 views
7

我有一个向量类指针std::vector<Square*> listSquares。我想用类的其中一个属性作为关键字进行排序。这是我在做什么std :: sort()在类指针向量上

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 

std::sort(listSquares.begin(), listSquares.end(), compById) 

但是编译器说: 错误:没有匹配函数调用“排序(标准::矢量::迭代器,性病::矢量::迭代器,<悬而未决超载功能类型>)'

我在做什么错在这里?

+6

如果你可以使用C++ 11,你应该做这个拉姆达:'的std ::排序(listSquares.begin(),listSquares.end(),[](方*一,广场* B ){return a-> getId()< b-> getId;})'。 – leftaroundabout 2013-05-03 20:28:39

+2

确保你确实需要指针而不仅仅是对象。 – chris 2013-05-03 20:30:19

+0

我无法使用C++ 11。 @chris我相信我想使用指针。 – qutab 2013-05-03 20:37:45

回答

12

为了使用compById作为std::sort的参数,它不应该是成员函数。这是错误的

class Square 
{ 
    bool compById(Square* a, Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
    ... 
}; 

这是更好的,

class Square 
{ 
    ... 
}; 

bool compById(Square* a, Square* b) 
{ 
    return a->getId() < b->getId(); 
} 
+0

非常感谢。这是问题。但为什么我们不能将它声明为成员函数呢?实际上,我使用的是不同于正方形的课程。 – qutab 2013-05-03 20:47:55

+2

因为std :: sort在调用成员函数时如何知道使用哪个对象?成员函数只能在对象上调用,但std :: sort没有上下文来确定应该是哪个对象。大概你从某个对象内部调用了std :: sort,但是你并没有将该对象传递给std :: sort。 std :: sort不知道它从哪里被调用,它只知道传递给它的三个参数。 – john 2013-05-03 20:49:38

+3

+1用于心灵感应技能 – Basilevs 2013-05-04 08:10:10

3

你缺少的最重要的部分是比较函数的参数是const。另一种是返回类型。如果在声明函数时忽略返回类型,编译器会假定它返回int,在这种情况下这是不正确的。

当然,当您调用std::sort函数时,比较函数必须位于范围内。

+0

即使我使用const,我也会得到相同的错误。在这种情况下,我还得到, gameplay.cpp:911:错误:将'const Square'作为'int'参数传递给'int Square :: getId()'丢弃限定符[-fpermissive] – qutab 2013-05-03 20:36:39

+1

@qutab, getId()也是一个const成员函数。 – richselian 2013-05-03 20:43:54

1

您可以使用成员函数。但是您需要将其定义为静态成员函数,并从类中调用它,而不是类的实例。

通知static函数声明之前和Square::在函数名称之前进行排序。

class Square 
{ 
    /*...*/ 
public: 
    static bool compById(const Square* a, const Square* b) 
    { 
     return a->getId() < b->getId(); 
    } 
}; 

main() 
{ 
    /*...*/ 
    std::sort(listSquares.begin(), listSquares.end(), Square::compById); 
}