2011-07-18 10 views
4

小さなCOM DLL(Visual Studio 2008 proを使用)をコンパイルしようとしていますが、リリース時にコンパイルがうまくいきますが、デバッグでコンパイルしようとすると、エラー:C++デバッグ時にエラーが発生しましたが、リリースではありません

error C2664: 'bool (MyClass &, double)': cannot convert parameter 2 from 'MyClass' to 'double'.

今、このエラーは、私がこれを行うコードの行(someValueThatIsADoubleはdouble型であることに注意してください)から来ている:

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

そして以下の機能をこのように定義されています。

bool less(MyClass& a, double b); 

なぜこのエラーが発生するのかわかりません。このエラーが発生する理由がある場合は、どうして私はデバッグで(リリースではなく)取得するのですか?リリースでコンパイルされたdllは正常に動作し、クラッシュしません。また、私は確認し、#ifdef DEBUGやデバッグやリリースでコンパイルされたコードを変更する可能性のあるものはありません。

EDIT:

私はコードを自分で書いていないし、それは私がについて多くを知らないので、私は二重の値を表すために、私はしたくないと思われるか分からないアルゴリズムであり、 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'答えは、デバッグと述語の実装を解放するには、コードのISNので(それは私の場合はリリースではなく、デバッグでコンパイル作られ、同じではないことを示しました非常にきちんとしていて、2種類の比較機能を使うべきではありません)。私がデバッグでこのコードを使用できるようにするためにやったハックは、インクルードの前にこの行を置くことでした。(好ましい解決策はより良い比較機能を持つべきですが、私の場合は不可能でした。)

#define _HAS_ITERATOR_DEBUGGING 0 
+0

すべての定数関数に 'const'を加えた方が良いでしょう。 –

答えて

2

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

(述語と一般的なエラーの一つは、人々がこのようなa<bb<a両方その順序を定義するために使用されるということである。その場合には打破多く<algorithm> sが防ぐために、いくつかのデバッグチェックが今そこにある理由である、あります。このようなエラーあなたが実際に実行時に悪いa,b値のペアを渡すために管理する場合それでも、彼らが唯一のエラーをキャッチし、彼らは、コンパイル時に理論上のエラーをキャッチすることはできません)

+0

ああ、それは非常に可能です、ありがとう!では、提供されたコードを使用してデバッグでビルドできるようにする方法(おそらくハック)がありますか、または正しい演算子を書く方法を決める必要がありますか? – Carl

+1

これは、a == bのときは常にfalseと評価されるため、うまくいきません。しかし、多分Pred(a、b)=>!Pred(b、b)のようなものをテストするかもしれません。 –

+0

STLエラーチェックはあなたのようなエラーを見つけることを意図しています。あなたはそれをオフにすることができます。詳細についてはMSDNを参照してください。たとえば、ほとんどの専門家がリリースビルドの.PDBファイルを作成しました) – MSalters

1

はして試してみてください。

bool less(const MyClass& a, const MyClass& b); 
+0

私は少ない機能を変更したくないと言わざるを得ない。私の質問を編集しました。 – Carl

+0

lower_bound呼び出しに提供されるless関数は、指定されたコレクションの2つのアイテムを比較するために使用されます。コレクションはMyClassのコレクションであるため、関数が少ないほどMyClassインスタンスへの参照を少なくする必要があります。あなたはMyClassの宣言を提供できますか、それにいくつかの特定の演算子が定義されているかもしれません。 – rlods

+0

これは私の考えでも最初ですが、もしそうなら、それはなぜリリースモードでコンパイルされますか? – Carl

1
template<class ForwardIterator, class Type, class BinaryPredicate> 
ForwardIterator lower_bound(ForwardIterator first, ForwardIterator last, const Type& val, BinaryPredicate comp); 

は、最初:の位置をアドレス指定するイテレータ検索される範囲内の最初の要素。

last:検索対象の範囲内の最後の要素より1番目の位置を指定する前方イテレータ。

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

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

リリースでコンパイルされるのは、stdのリリース実装でいくつかのチェックが無効になるためです。しかし、コンパイルするべきではありません:valはMyClass型で、double型ではなく、リリース時にコンパイルしません。

関連する問題