2012-12-11 140 views
-1

我有一個非常奇怪的錯誤,當我嘗試和使用對象進行排序,在C++排序對象

required from 'void std::__final_insertion_sort(_RandomAccessIterator, _RandomAccessIterator, _Compare) [with _RandomAccessIterator = __gnu_cxx::__normal_iterator<Album*, std::vector<Album> >; _Compare = bool (*)(const Album*, const Album*)]' 

它似乎並沒有一個標準誤差的比較方法,但我看不到任何東西我的代碼錯了。這是比較方法還是排序本身的問題。任何幫助將不勝感激。

我附上了相關代碼:

Album.cpp:http://pastebin.com/0tNrbdrT

Album.h:http://pastebin.com/iY2Yy7qM

AlbumCollection.cpp:http://pastebin.com/gWj0nS8S

AlbumCollection.h:http://pastebin.com/bFrxme5n

相簿收藏分類:

void AlbumCollection::sortAlbums(){ 
    std::sort(albums.begin(), albums.end(), compareAlbums); 
} 

專輯比較方法:

bool Album::compareAlbums(const Album* a1,const Album* a2) 
{ 
    if (a1->getArtist() == a2->getArtist()){ 
     return (a1->getTitle() < a2->getTitle()); 
    }else{ 
     return a1->getArtist() < a2->getArtist() 
    } 
} 

的錯誤是:http://pastebin.com/PeXk0FUT

我不知道有多少是相關的,我是很新的C++

+2

請縮小代碼並將其發佈到此處。 [SSCCE](http://www.sscce.org/) – jrok

+1

這只是錯誤的一小部分。請張貼那一行之前的行。 – molbdnilo

+2

請發佈完整的錯誤消息。我想你可以告訴一個句子不以「required from」開始 – Angew

回答

3

這裏有兩個錯誤。首先,compareAlbums函數需要是一個自由函數,而不是Album類的成員函數。其次,compareAlbums函數必須對Album對象進行const引用,因爲這是存儲在向量中的內容。所以,這應該修復它:

bool compareAlbums(const Album& a1,const Album& a2) 
{ 
    if (a1.getArtist() == a2.getArtist()){ 
     return (a1.getTitle() < a2.getTitle()); 
    } else { 
     return a1.getArtist() < a2.getArtist() 
    } 
} 
+0

錯誤消息中的簽名表示它不是非靜態成員函數。他可能會剪掉一個「靜態」。 – Potatoswatter

+0

@Patatoswatter這是因爲他的頭文件中有兩個compareAlbums聲明,一個是自由函數,一個是非靜態成員函數(兩種情況下都是指針)。然而,在cpp文件中,他只實現了成員函數。因此,解決方案是刪除成員函數聲明,更新自由函數聲明以取代const引用,並使用上面在cpp文件中提供的定義。 –

+0

啊,他正在巡航出現鏈接錯誤。請注意,如果不使用特殊語法'&Album :: compareAlbums',這是一個不太可能的新手錯誤,您將無法獲得PTMF。 – Potatoswatter

1

您已經嘗試使用以指針作爲參數的函數對std::vector進行排序。比較函數被賦予對其參數的引用,而不是指針。

眼前的問題應該簡單地通過採取比較功能和調整其固定從

bool compare(const Album*, const Album*) 

bool compare(Album const &, Album const &)