当我尝试使用自定义比较器对我的成分进行排序时,我收到此编译器错误。
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;
}
}
答案 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()是你想要的那个,那么它需要是一个静态成员函数。