1

タイトルは主な質問です。正確なシナリオ (私は「名前空間 std を使用しています;」):

void SubstringMiner::sortByOccurrence(list<Substring *> & substring_list) {
   list::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator);
}

これは比較器の定義です:

class Substring {
    // ...
    class OccurrenceComparator {
        public:
            bool operator() (Substring * a, Substring *b);
    }
};

コンパレータの実装は直感的で簡単です。std::set で非常によく似たコンパレータも使用していますが、正常に動作します。sortByOccurrence() 関数を追加すると、タイトルにエラーが表示されます。

私は何をすべきか?

編集: Substring::OccurrenceComparator() をコンパレータとして渡そうとしていますが、次のエラーが発生しています:

g++ -Wall -g -c substring_miner.cpp -o obj/subtring_miner.o
substring_miner.cpp: In function ‘void SubstringMiner::sortByOccurrence(std::list<Substring*, std::allocator<Substring*> >&)’:
substring_miner.cpp:113: error: no matching function for call to ‘std::list<Substring*, std::allocator<Substring*> >::sort(std::_List_iterator<Substring*>, std::_List_iterator<Substring*>, Substring::OccurrenceComparator)’
/usr/include/c++/4.3/bits/list.tcc:303: note: candidates are: void std::list<_Tp, _Alloc>::sort() [with _Tp = Substring*, _Alloc = std::allocator<Substring*>]
make: *** [substring_miner] Error 1

私のコード行は次のとおりです。

list<Substring *>::sort(substring_list.begin(), substring_list.end(), Substring::OccurrenceComparator());

テンプレートを削除できないか、テンプレート パラメーターが間違っているというエラーが表示されます。

4

3 に答える 3

4

listmembersortは非静的関数であるため、リスト インスタンスで呼び出す必要があります。

substring_list.sort( Substring::OccurrenceComparator() );

編集:std::sortイテレータではないランダム アクセス イテレータが必要なため、 free 関数は使用できませlistん。

于 2009-07-08T21:55:32.597 に答える
4

クラスを引数として関数に渡しています。それはできません - クラスのインスタンスを作成し、それを渡す必要があります:

substring_list.sort(Substring::OccurrenceComparator());

上記の後の余分な括弧OccurenceComparatorは、デフォルトのコンストラクターを使用してクラスの一時オブジェクトを作成することに注意してください。

もう 1 つの間違いは、list::sortclass の静的関数として呼び出していることですstd::list。静的ではないため、 のメンバー関数として呼び出す必要がありますsubstring_list

于 2009-07-08T21:39:09.977 に答える