1

次の最後の行で発生するコンパイラエラーがわかりません。

#include <iostream>
#include <algorithm>


struct X{
  int number;
};
bool same_number_X(const int & a, const X & b)
{ return a == b.number; }


bool same_number_int(const int & a, const int & b)
{ return a == b; }


int main(){

   std::vector<int> vec1{1,2,3};
   std::vector<int> vec2{2,3,1};
   std::vector<X> vec3{{2},{3},{1}};

   std::cout << std::is_permutation(vec1.begin(), vec1.end(), vec2.begin(), same_number_int);
   std::cout << std::is_permutation(vec1.begin(), vec1.end(), vec3.begin(), same_number_X);
}

あなたはここにエラーを見ることができます それは言う

In instantiation of 'typename std::iterator_traits<_InputIterator>::difference_type std::count_if(_IIter, _IIter, _Predicate) [with _IIter = __gnu_cxx::__normal_iterator<X*, std::vector<X> >; _Predicate = std::_Bind<bool (*(std::_Placeholder<1>, int))(const int&, const X&)>; typename std::iterator_traits<_InputIterator>::difference_type = long int]':
c++/4.7/bits/stl_algo.h:4367:37: required from 'bool std::is_permutation(_FIter1, _FIter1, _FIter2, _BinaryPredicate) [with _FIter1 = __gnu_cxx::__normal_iterator<int*, std::vector<int> >; _FIter2 = __gnu_cxx::__normal_iterator<X*, std::vector<X> >; _BinaryPredicate = bool (*)(const int&, const X&)]'
source.cpp:23:90: required from here
c++/4.7/bits/stl_algo.h:4681:2: error: no match for call to '(std::_Bind<bool (*(std::_Placeholder<1>, int))(const int&, const X&)>) (X&)'

誰かがそれをコンパイラ以外の言葉で説明/解決できますか?:-)

4

1 に答える 1

3

C++11規格のパラグラフ25.2.12/1から:

template<class ForwardIterator1, class ForwardIterator2>
bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
                    ForwardIterator2 first2);

template<class ForwardIterator1, class ForwardIterator2, class BinaryPredicate>
bool is_permutation(ForwardIterator1 first1, ForwardIterator1 last1,
                    ForwardIterator2 first2, BinaryPredicate pred);

1必須ForwardIterator1ForwardIterator2 同じ値型でなければなりません。比較関数は同値関係でなければならない。

への最後の呼び出しでis_permutation()は、最初の引数(型ForwardIterator1が推定される)はint値のイテレータであり、3番目の引数(型ForwardIterator2が推定される)はX値のイテレータです。したがって、上記の段落に記載されている前提条件に違反しています。

于 2013-03-04T19:03:33.177 に答える