0

基本的にSTLSetクラスと同じカスタムSetクラスを使用しています

問題は、私がどういうわけかそれを間違って実装していて、私が定義した比較ではなく、デフォルトの比較関数が使用されていることです。

Set<Lexicon::CorrectionT> Lexicon::suggestCorrections(Lexicon::MatchesT & matchSet)
{
    Set<CorrectionT> suggest(compareCorr); //ordered Set
    suggestCorrectionsHelper(root, suggest, 0, matchSet.testWord, 0, matchSet.testTime);
    return suggest;
}


int compareCorr(Lexicon::CorrectionT a, Lexicon::CorrectionT b)
{
    if (a.editDistance < b.editDistance)
        return -1;
    else if (a.editDistance == b.editDistance)
            return 0;
    else
        return 1;
}

struct CorrectionT {
    int editDistance; //stackItems
    string suggestedWord; //stackItems
};

いくつかの研究:

  • クラスライブラリ
  • 同じクラスの問題-STLSetクラスが使用されていることを示唆しています。この場合でも、比較関数の定義方法を理解するための支援が必要な場合があるため、質問を投稿してください

「エラーC2784:'bool std :: operator ==(const std :: _ Tree <_Traits>&、const std :: _ Tree <_Traits>&)」の形式に関連する19個のC2784エラーがあります:テンプレートを推測できませんでした'Lexicon::CorrectionT'からの'conststd :: _ Tree <_Traits>&'の引数

このコードを参照する

template <typename Type>
int OperatorCmp(Type one, Type two) {
    if (one == two) return 0;
    if (one < two) return -1;
    return 1;
}

私の質問:これを修正することをどのように提案しますか?

デフォルトの定義タイプを変更してみてください:

#include "lexicon.h"

//template <typename Type>
int OperatorCmp(Lexicon::CorrectionT one, Lexicon::CorrectionT two) {
    if (one.editDistance == two.editDistance) return 0;
    if (one.editDistance < two.editDistance) return -1;
    return 1;
}

#endif
4

1 に答える 1

1

STLの比較関数は、クラスがSTLと同じにならないように、 StrictWeakOrderingsetである必要があります。set

エラーは、デフォルトOperatorCmpが使用されていることを示しています。理由はわかりませんが、タイプを定義することで、デフォルトを機能させることがoperator<できoperator==ますCorrectionT

于 2012-07-09T01:09:02.607 に答える