Esta es una reproducción simplificada que ilustra cómo funciona class Predicate
fuera de main()
, pero cuando el código exacto aparece en línea como class InlinePredicate
, el compilador no puede coincidir con std::sort
. Lo extraño es que puede pasar cualquier cosa como el tercer argumento a std::sort
(digamos, entero 7) y obtendrá un error de compilación cuando no sea compatible con el operator()
que sort
espera. Pero cuando pase por debajo pred2
que no coincide en absoluto:¿Por qué falla este predicado std :: sort cuando la clase está dentro de main()?
#include <string>
#include <vector>
#include <algorithm>
using namespace std;
class Predicate {
public:
bool operator() (const pair<string,int>& a, const pair<string,int>& b)
{
return a.second < b.second;
}
};
int
main()
{
vector<pair<string, int> > a;
Predicate pred;
sort(a.begin(), a.end(), pred);
class InlinePredicate {
public:
bool operator() (const pair<string,int>& a, const pair<string,int>& b)
{
return a.second < b.second;
}
} pred2;
sort(a.begin(), a.end(), pred2);
return 0;
}
repro.cc: In function ‘int main()’:
repro.cc:30: error: no matching function for call to ‘sort(__gnu_cxx::__normal_iterator, std::allocator >, int>*, std::vector, std::allocator >, int>, std::allocator, std::allocator >, int> > > >, __gnu_cxx::__normal_iterator, std::allocator >, int>*, std::vector, std::allocator >, int>, std::allocator, std::allocator >, int> > > >, main()::InlinePredicate&)’
Como nota al margen: el operador debe probablemente ser const 'operador booleano() (const par y un par const y b) ** **' const –