この質問に続いて、私はVS2010でここにある例をコピーして貼り付けようとしました:
#include <algorithm>
#include <vector>
#include <iostream>
struct S
{
int number;
char name;
S ( int number, char name )
: number ( number ), name ( name )
{}
// only the number is relevant with this comparison
bool operator< ( const S& s ) const
{
return number < s.number;
}
};
struct Comp
{
bool operator() ( const S& s, int i )
{
return s.number < i;
}
bool operator() ( int i, const S& s )
{
return i < s.number;
}
};
int main()
{
std::vector<S> vec = { {1,'A'}, {2,'B'}, {2,'C'}, {2,'D'}, {3,'F'}, {4,'G'} }; //this syntax won't compile in VS2010, so you can leave an empty vector here
auto p = std::equal_range(vec.begin(),vec.end(),2,Comp());
for ( auto i = p.first; i != p.second; ++i )
std::cout << i->name << ' ';
}
これはリリース モードでは正常にコンパイルされますが、デバッグ モードではコンパイルに失敗します。その理由は、デバッグ モードでは、指定された述語を使用して、反復子の範囲が既に並べ替えられているかどうかを実装が確認するためです。
template<class _FwdIt,
class _Pr> inline
void _Debug_order2(_FwdIt _First, _FwdIt _Last, _Pr _Pred,
_Dbfile_t _File, _Dbline_t _Line, forward_iterator_tag)
{ // test if range is ordered by predicate, forward iterators
for (_FwdIt _Next = _First; _First != _Last && ++_Next != _Last; ++_First)
if (_DEBUG_LT_PRED(_Pred, *_Next, *_First))
_DEBUG_ERROR2("sequence not ordered", _File, _Line);
}
これは最終的に次のように呼び出します:
template<class _Pr, class _Ty1, class _Ty2> inline
bool _Debug_lt_pred(_Pr _Pred,
const _Ty1& _Left, const _Ty2& _Right,
_Dbfile_t _File, _Dbline_t _Line)
{ // test if _Pred(_Left, _Right) and _Pred is strict weak ordering
if (!_Pred(_Left, _Right))
return (false);
else if (_Pred(_Right, _Left))
_DEBUG_ERROR2("invalid operator<", _File, _Line);
return (true);
}
私の場合を除いて、operator()
左と右の両方の「S」引数を取ることはできません。では、Visual の実装にバグはありますか? それとも、元の例は移植可能ではないのでしょうか? 3番目の operator() オーバーロードを提供することで機能させることができると思いますが、なくても機能するはずです
ありがとう