0

我正在使用与 STL Set 类基本相同的自定义 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
};

一些研究:

  • 类库
  • 同一个类的问题- 建议使用 STL Set 类,在这种情况下,我可能仍需要帮助了解如何定义比较函数,所以发布问题

我有 19 个 C2784 错误,所有这些错误都与某种形式的“错误 C2784:'bool std::operator ==(const std::_Tree<_Traits> &,const std::_Tree<_Traits> &)':无法推断模板来自 'Lexicon::CorrectionT' 的 'const std::_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 的比较函数set必须是Strict Weak Ordering,因此该类STL 不同set

该错误表明OperatorCmp正在使用默认值,我不知道为什么,但是您可以通过为您的类型定义operator<和来使该默认值起作用。operator==CorrectionT

于 2012-07-09T01:09:02.607 回答