-1

C ++のcompareメソッドを使用してオブジェクトを並べ替えようとすると、非常に奇妙なエラーが発生します

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*)]'

標準エラーではないようですが、コードに問題はありません。それはcompareメソッドの問題ですか、それともソート自体の問題ですか。どんな助けでも大歓迎です。

関連するコードを添付しました:

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

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

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

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

AlbumCollectionソート:

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++はまったく初めてです。

4

2 に答える 2

3

ここには 2 つのエラーがあります。まず、compareAlbums 関数は、Album クラスのメンバー関数ではなく、フリー関数である必要があります。第 2 に、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()
    }
}
于 2012-12-11T16:23:02.780 に答える
1

std::vectorポインタを引数として取る関数を使用して aをソートしようとしました。比較関数には、ポインターではなく、その引数への参照が与えられます。

当面の問題は、比較関数を取得してから調整するだけで修正できます。

bool compare(const Album*, const Album*)

bool compare(Album const &, Album const &)
于 2012-12-11T16:22:00.780 に答える