2013-02-28 98 views
0

當我嘗試使用自定義比較器對成分進行排序時,出現此編譯器錯誤。無法使用自定義比較器函數對列表進行排序

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

你怎麼定義排序?錯誤是說你沒有與之相匹配的電話。 – TopGunCoder 2013-02-28 18:21:51

+1

@TopGunCoder:'std :: list'有一個'sort()'函數,它需要一個比較器。 – 2013-02-28 18:25:49

+2

你有沒有其他名字爲'sortFunction'的函數? 'sortFunction'是'Kitchen'的非靜態成員? – 2013-02-28 18:31:19

回答

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

你確定這個原因嗎? – Slava 2013-02-28 18:28:00

+0

我以前就是這樣,它給了我同樣的錯誤。 :( – 2013-02-28 18:28:21

+0

@LoganShire請參閱編輯。 – Dukeling 2013-02-28 18:29:24

2

看起來你在Kicthen中有一個名爲sortFunction的方法,編譯器無法選擇合適的方法。 你可以試試這個:

list.sort(::sortFunction); 

要解決這個問題,或者如果您提供的假設是廚房類的方法的功能,你需要解決這個問題。

BTW:

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

是一樣的:

return a.getName() < b.getName(); 
1

我的猜測是,你聲明一個成員函數Kitchen::sortFunction。在另一個成員函數(如printContents)中,這將隱藏您要使用的非成員函數。

錯誤消息表明這種情況;它試圖爲成員函數類型bool (Kitchen::*)(const Ingredient&, const Ingredient&)實例化sort

如果成員函數不應該存在,則刪除該聲明。如果是,則重命名其中一個函數,或者將非成員函數稱爲::sortFunction

0

你的排序功能是:

bool sortFunction(const Ingredient a, const Ingredient b) 

但是這或許應該是:

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

(注意參考)

此外,如前所述,您的廚房類已經有一個函數稱爲sortFunction(),它的優先級是,所以要麼使用:: sortFunction(),要麼爲每個函數提供一個唯一的,更具描述性的名稱。

如果Kitchen :: sortFunction()是你想要的,它需要是一個靜態成員函數。

相關問題