1

_HAS_ITERATOR_DEBUGGING次のコードは、マクロが等しい場合、C++Builder 2009 または Visual C++ 2005 ではコンパイルされません1が、コメント アウトされている場合はコンパイルされます。関数がlower_bound仕様に準拠していないようです。ライブラリは引数を交換しています。仕様書の抜粋です。value常に 2 番目の引数にする必要があります。私が間違っている?

注: テスト コードは、実行するようには設計されていません。これは、ライブラリのバグを説明するために設計されました。

C++ 仕様の抜粋

template<class ForwardIterator, class T, class Compare>
ForwardIterator
lower_bound(ForwardIterator first, 
            ForwardIterator last, 
            const T& value, 
            Compare comp);

25.3.3.1.3

戻り値: 範囲 [first, last] 内の最も遠い反復子 i (ただし、範囲 [first, i) 内の任意の反復子 j に対して、次の対応する条件が保持されます: *j < 値または comp(*j, 値) != false

Visual Studio のエラー メッセージ

メッセージ: エラー C2664: 'double mike::operator ()(const double,const char *) const': パラメーター 1 を 'const char [1]' から 'const double' に変換できません

ファイル: c:\program files\microsoft Visual Studio 8\vc\include\xutility

ライン番号: 314

テストコード

#define _HAS_ITERATOR_DEBUGGING 1  // needs to be in the stdafx.h file for Visual Studio
#include "stdafx.h"
#include <algorithm>
#include <functional>

struct mike : public std::binary_function<double, char*, double> {
   double operator() (const double i, const char*) const {
      return i;
   }
};

int main()
{
   double r[] = {0};
   std::lower_bound(r, r, "", mike());
   return 0;
}
4

1 に答える 1

7

これは、Visual C++ 2005 C++ 標準ライブラリの実装における既知の問題です ( Microsoft Connect の「デバッグ モードでコンパイルするときに、両方のパラメーターが同じ型であると想定するためのバイナリ述語パラメーター」lower_boundを参照してください)。

このバグは、Visual C++ 2008 で修正されました。

于 2011-07-20T21:51:12.873 に答える