私は、std :: sortに渡すことができるファンクタを記述しようとしています。これは、ベクトルのオブジェクトの比較に基づいて、オブジェクトの別のベクトルのインデックスを表すベクトルをソートします。ベクトルのオブジェクトにはメンバー演算子<があると仮定するのではなく、オブジェクトのベクトルを直接ソートする場合はstd :: sortに渡すなどの述語を渡したいと思います。ファンクタにファンクタを渡す
template <class T, class _Pr>
class SortIndexVectorObjectsHelper : public std::binary_function<ULONG, ULONG, bool>
{
ULONG m_ulSize;
std::vector<T> & m_aItems;
BOOL m_bSortAscending;
_Pr m_Comp;
public:
SortIndexVectorObjectsHelper(std::vector<T> & aItems, _Pr Comp) : m_aItems(aItems), m_Comp(Comp), m_ulSize(0)
{
m_ulSize = m_aItems.size();
}
bool operator()(ULONG & rLeft, ULONG & rRight)
{
if (rLeft < m_ulSize && rRight < m_ulSize)
{
T & pLeft = m_aItems[rLeft];
T & pRight = m_aItems[rRight];
if (pLeft && pRight)
{
return m_Comp(pLeft, pRight);
}
}
return false;
}
};
struct SortFooByX: public std::binary_function<CFoo,CFoo, bool>
{
BOOL m_bSortAscending;
SortFooByX(BOOL bSortAscending)
{
m_bSortAscending = bSortAscending;
}
bool operator()(CFoo & _Left, CFoo & _Right)
{
if (m_bSortAscending)
{
if (_Left.X() < _Right.X())
return true;
}
else
{
if (_Left.X() > _Right.X())
return true;
}
return false;
}
};
std::sort(aFooIndicies.begin(), aFooIndicies.end(), SortIndexVectorObjectsHelper<CFoo, std::binary_function<CFoo, CFoo, bool> >(aFoo, SortFooByX(FALSE)));
これをコンパイルすると、2つのオーバーロードのいずれも、すべての引数タイプを変換できないというエラーが表示されます。
あなたの 'operator()'は 'const T&'型の2つの引数を受け取り、 'ULONG'を受け取るように設計されていると思います。 –
_Prは予約済みの識別子です。それを使用しないでください。 –