在默认比较中设置类忽略定义的comp fn和错误

时间:2012-07-08 22:13:06

标签: c++ visual-studio-2008 set

我使用的自定义Set类与STL 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
};

一些研究:

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

我有19个C2784错误都与某些形式的“错误C2784:'bool std :: operator ==(const std :: _ Tree&lt; _Traits&gt;&amp;,const std :: _ Tree&lt; _Traits&gt;&amp;)'有关:无法推断'const std :: _ Tree&lt; _Traits&gt;&amp;'的模板参数来自'Lexicon :: CorrectionT'

并引用此代码

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

1 个答案:

答案 0 :(得分:1)

STL set的比较函数必须是Strict Weak Ordering,因此该类与STL set相同。

该错误表示正在使用默认的OperatorCmp,我不知道为什么,但您可以通过为{{1}定义operator<operator==来使默认值正常工作输入。