无法使用自定义比较器功能排序列表

时间:2013-02-28 18:18:23

标签: c++ list sorting

当我尝试使用自定义比较器对我的成分进行排序时,我收到此编译器错误。

kitchen.cpp: In member function ‘void Kitchen::printContents(std::ofstream&)’:
kitchen.cpp:172: error: no matching function for call to ‘std::list<Ingredient, std::allocator<Ingredient> >::sort(<unresolved overloaded function type>)’
/usr/include/c++/4.2.1/bits/list.tcc:271: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Ingredient, _Alloc = std::allocator<Ingredient>]
/usr/include/c++/4.2.1/bits/list.tcc:348: note:                 void std::list<_Tp, _Alloc>::sort(_StrictWeakOrdering) [with _StrictWeakOrdering = bool (Kitchen::*)(const Ingredient&, const Ingredient&), _Tp = Ingredient, _Alloc = std::allocator<Ingredient>]

以下是导致它的代码:

bool sortFunction(const Ingredient a, const Ingredient b)
{
    if (a.getQuantity() < b.getQuantity())
        return true;
    else if (a.getQuantity() == b.getQuantity())
    {
        if (a.getName() < b.getName()) return true;
        else return false;
    }
    else return false;
}

void Kitchen::printContents(std::ofstream &ostr)
{
    ostr << "In the kitchen: " << std::endl;

    ingredients.sort(sortFunction);

    std::list<Ingredient>::iterator itr;
    for (itr = ingredients.begin(); itr != ingredients.end(); ++itr)
    {
        ostr << std::setw(3) << std::right << itr->getQuantity() << " " 
        << itr->getName() << std::endl;

    }
}

4 个答案:

答案 0 :(得分:3)

某处可能有另一个sortFunction(例如在Kitchen中),导致上述错误。

尝试

ingredients.sort(::sortFunction);

this question类似。

另外,对于良好的编码习惯,您可能想要更改

bool sortFunction(const Ingredient a, const Ingredient b)

bool sortFunction(const Ingredient &a, const Ingredient &b)

第一个是传递对象的副本,第二个传递给它的引用。

答案 1 :(得分:2)

看起来你在Kicthen中有一个名为sortFunction的方法,编译器无法选择合适的方法。 你可以试试这个:

list.sort( ::sortFunction );

要解决它,或者如果你提供的函数假设是Kitchen类的方法,你需要解决它。

顺便说一下:

if (a.getName() < b.getName()) return true;
else return false;

与:

相同
return a.getName() < b.getName();

答案 2 :(得分:1)

我的猜测是你声明了一个成员函数Kitchen::sortFunction。在另一个成员函数(例如printContents)中,将隐藏您要使用的非成员函数。

错误消息表明情况确实如此;它试图为成员函数类型sort实例化bool (Kitchen::*)(const Ingredient&, const Ingredient&)

如果不存在成员函数,则删除声明。如果是,则重命名其中一个函数,或将非成员函数称为::sortFunction

答案 3 :(得分:0)

您的排序功能是:

bool sortFunction(const Ingredient a, const Ingredient b)

但它应该是:

bool sortFunction(const Ingredient &a, const Ingredient &b)

(注意参考文献)

另外,如前所述,您的Kitchen类已经有一个名为sortFunction()的函数,并且它优先使用,所以要么使用:: sortFunction(),要么为每个函数赋予一个唯一且描述性更强的名称。

如果Kitchen :: sortFunction()你想要的那个,那么它需要是一个静态成员函数。