小さな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