2010-12-05 80 views
4

我試圖排序的指針列表(在我的情況下,每個指針作業類型) 我的本意是通過其序列號問題排序的指針列表

void Container::jobSort(list<Job*> &jobs) { 
    sort(jobs.begin(), jobs.end(), jobSerialCompare); 
} 

bool Container::jobSerialCompare(const Job *jobA,const Job *jobB) { 

    return (jobA->getSn()<jobB->getSn()); 
} 

錯誤的作業進行分類我得到的是:

error: no matching function for call to 'sort(std::_List_iterator<Job*>, std::_List_iterator<Job*>, <unresolved overloaded function type>)' 
/usr/include/c++/4.2.1/bits/stl_algo.h:2852: note: candidates are: void std::sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = std::_List_iterator<Job*>, _Compare = bool (Container::*)(const Job*, const Job*)] 
make: *** [src/Container.o] Error 1 

我設法通過改變代碼解決錯誤如下:

struct compare { 
    bool operator()(const Job *jobA, const Job *jobB) { return (jobA->getSn()<jobB->getSn()); 
} 
}; 

void Container::jobSort(list<Job*> &jobs) { 
    jobs.sort(compare()); 
} 

沒有編譯錯誤,但現在我想知道什麼是錯我的初始步驟, 幫助表示讚賞, 歡呼

編輯 - 非常感謝所有幫助大家! 所有不同的答案有助於繪製更清晰的畫面

回答

3

錯誤消息說,這一切。您正嘗試使用sort()來排序列表,該列表需要隨機訪問迭代器。 List僅支持雙向迭代器,所以獨立排序()不起作用。這就是爲什麼你必須使用特定的算法列表:list.sort();

還有人發現非靜態比較問題,這與你得到的消息無關(但仍然必須修復)。

2

在你的第一個版本的Container::jobSerialCompare是一個成員函數因此具有this一個隱含的第一個參數,所以它不適合於什麼std::sort()期待。解決這個問題的方法是在全局範圍內定義函數,或者像以前那樣定義一個仿函數,即類別爲operator()()

編輯:...或者使用mem_fun作爲VINS表明

2

在第一種情況下,Container::jobSerialCompare是一個成員函數。您應該使用mem_fun函數將成員函數轉換爲函數對象,以便與sort一起使用它。試着寫

#include <functional> 
... 
void Container::jobSort(list<Job*> &jobs) { 
sort(jobs.begin(), jobs.end(), mem_fun(&Container::jobSerialCompare)); 

}