2016-10-24 10 views
1

ベクトルの要素をソートするソートアルゴリズムを使用しようとしています。 これは私のコードスニペットです。C++テンプレートエラー

コンパレータ

struct comparator 
{ 
    bool operator() (OptVector<pair<int, pair<CgpPop*,CgpPop*> > >::iterator it1, OptVector<pair<int, pair<CgpPop*,CgpPop*> > >::iterator it2) 
    { 
      return (((*it1).first) < ((*it2).first)); 
    } 
} o_comparator; 

マイベクトル - ここOptVectorは、標準C++ベクトルと同様に動作ベクトルオーバーラッパーです。

sort<OptVector< pair<int, pair<CgpPop*,CgpPop*> > >::iterator > (pll_units.begin(), pll_units.end(), o_comparator); 

ALGOソートする

OptVector< pair<int, pair<CgpPop*,CgpPop*> > > pll_units; 

コールしかし、コンパイラは

/calm/svr/sql/generic/stlinclude/stl/_algo.c: In function ‘const _Tp& _STL::__median(const _Tp&, const _Tp&, const _Tp&, _Compare) [with _Tp = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >, _Compare = comparator]’: 
/calm/svr/sql/generic/stlinclude/stl/_algo.c:820: instantiated from ‘void _STL::__introsort_loop(_RandomAccessIter, _RandomAccessIter, _Tp*, _Size, _Compare) [with _RandomAccessIter = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _Tp = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >, _Size = long int, _Compare = comparator]’ 
/calm/svr/sql/generic/stlinclude/stl/_algo.c:841: instantiated from ‘void _STL::sort(_RandomAccessIter, _RandomAccessIter, _Compare) [with _RandomAccessIter = _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _Compare = comparator]’ 
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1249: instantiated from here 
/calm/svr/sql/generic/stlinclude/stl/_algo.c:78: error: no match for call to ‘(comparator) (const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&)’ 
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1192: note: candidates are: bool comparator::operator()(_STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*) 
/calm/svr/sql/generic/stlinclude/stl/_algo.c:79: error: no match for call to ‘(comparator) (const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&, const _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >&)’ 
/calm/svr/sql/generic/source/codegen/cgpop.cpp:1192: note: candidates are: bool comparator::operator()(_STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*, _STL::pair<int, _STL::pair<CgpPop*, CgpPop*> >*) 

次のエラーがスローされますいずれかが私のミスであるものを私に提案してくださいもらえますか?

答えて

3

コンパレータファンクタは、比較のためのパラメータとして要素を取りますが、イテレータは使用しません。

あなたは値の型にイテレータからcomparator::operator()のパラメータタイプを変更する必要があります。

struct comparator 
{ 
    bool operator() (const pair<int, pair<CgpPop*,CgpPop*> > & lhs, const pair<int, pair<CgpPop*,CgpPop*> > & rhs) const 
    { 
     return lhs.first < rhs.first; 
    } 
}; 

ところで:operator()のconstメンバ関数を作ることは良い習慣です。

+0

また、 'sort()'の呼び出しを 'sort(pll_units.begin)、pll_units.end()、o_comparator)に短縮することができます。 ' – Leon

+0

また、lambdaはC++ 11以降の言語の一部です。 – skypjack

+0

ありがとうございました...それは働きました...そして私はまた、より良い方法でその用途を理解しました。 @Leon。 –

関連する問題