4

小さなCOMdllを(visual studio 2008 proを使用して)コンパイルしようとしていますが、リリースでは正常にコンパイルされますが、デバッグでコンパイルしようとすると、コンパイルエラーが発生します。

エラーC2664:'bool(MyClass&、double)':パラメータ2を'MyClass'から'double'に変換できません。

このエラーは、これを行うコードの行から発生します(someValueThatIsADoubleはdouble型であることに注意してください)。

std::vector<MyClass>::iterator iter = std::lower_bound(MyVector.begin(), MyVector.end(), someValueThatIsADouble, less);

そして、less関数は次のように定義されます。

bool less(MyClass& a, double b);

このエラーが発生する理由がわかりません。このエラーの正当な理由がある場合、なぜデバッグでのみ発生するのですか(リリースでは発生しません)?リリースでコンパイルされた場合、dllは正常に実行され、クラッシュしません。また、チェックし#ifdef DEBUGたところ、デバッグやリリースでコンパイルされたコードを変更する可能性のあるものはありませんでした。

編集:

私は自分でコードを書いたわけではなく、それは私があまり知らないアルゴリズムなので、double値が何を表すのかわからないので、less関数内のロジックをに変更したくありません。 2番目のパラメーターとしてdoubleの代わりにMyClassを取ります。

class MyClass
{
public :
    MyClass(): _dValue1(0.0),_dValue2(0.0),_dValue3(0.0)
    {
    }
    MyClass(double dValue1, double dValue3, double dValue2): _dValue2(dValue2),_dValue3(dValue3),_dValue1(dValue1)
    {
    }
    ~MyClass() {}
    double getValue1() {return _dValue1;}
    double getValue3() {return _dValue3;}
    double getValue2() {return _dValue2;}
    double _dValue1;
    double _dValue3;
    double _dValue2;

public:

    friend class vector<MyClass>; 


int compare(const MyClass & t1, const MyClass & t2)
{
  if (t1._dValue1 < t2._dValue1)
    return -1;
  else if (t2._dValue1 < t1._dValue1)
    return 1;
  else
    return 0;
}

bool operator> (const MyClass & rhs)
{
    if (  _dValue1 > rhs._dValue1)
        return true;
    else 
        return false;
}

bool operator< (const MyClass & rhs)
{
    if (  _dValue1 < rhs._dValue1)
        return true;
    else 
        return false;
}

};

編集:

MSaltersの回答は、述語のデバッグとリリースの実装が同じではないことを示していました。これにより、私の場合はデバッグではなくリリースでコンパイルされました(コードがあまりきれいではなく、2との比較関数を使用するべきではないため)他の種類)。このコードをデバッグで使用できるようにするために行ったハックは、インクルードの前にこの行を配置することでもありました(推奨される解決策は、より優れた比較関数を使用することですが、私の場合は不可能でした)。

#define _HAS_ITERATOR_DEBUGGING 0 
4

3 に答える 3

2

エラーメッセージは、MSVCを使用していることを示しています。ライブラリの実装には、述語のデバッグチェックが含まれています。特に、半順序述語(yourなどless)の場合、。かどうかをテストすると思いますPred(a,b) && Pred(b,a) == false。明らかに、それはここでは機能しません。

(述語の一般的なエラーの1つは、との両方のような順序を定義していたことa<bですb<a。その場合、多く<algorithm>のsが機能しなくなるため、このようなエラーを防ぐためのデバッグチェックがいくつかあります。実行時に実際に不正なa,b値のペアを渡すことができた場合のエラー。コンパイル時に理論上のエラーをキャッチできません)

于 2011-07-18T13:26:39.140 に答える
1

試してみてください:

bool less(const MyClass& a, const MyClass& b);
于 2011-07-18T13:15:28.043 に答える
1
template<class ForwardIterator, class Type, class BinaryPredicate>
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const Type& val, BinaryPredicate comp);

first:検索する範囲の最初の要素の位置をアドレス指定する順方向イテレータ。

last:検索する範囲の最後の要素の1つ先の位置をアドレス指定する順方向イテレータ。

val:最初の位置または可能な最初の位置が順序付けられた範囲で検索されている値。

comp:ある要素が別の要素よりも小さいという意味を定義するユーザー定義の述語関数オブジェクト。バイナリ述語は2つの引数を取り、満たされた場合はtrueを返し、満たされていない場合はfalseを返します。

stdのリリース実装で一部のチェックが無効になっているため、リリースでコンパイルされます。ただし、コンパイルしないでください。valはMyClass型であり、double型ではない必要があります。そうすると、リリースでもlessはコンパイルされなくなります。

于 2011-07-18T13:39:39.530 に答える