La fonction de sorting ne fonctionne pas avec un object fonction créé sur une stack?

#include #include #include class Integer { public: int m; Integer(int a):m(a){}; }; class CompareParts { public: bool operator()(const Integer & p1,const Integer & p2) { return p1.m<p2.m; } }obj1; int main() { std::vector vecInteger; vecInteger.push_back(Integer(12)); vecInteger.push_back(Integer(13)); vecInteger.push_back(Integer(5)); vecInteger.push_back(Integer(7)); vecInteger.push_back(Integer(9)); Integer obj2(); std::sort(vecInteger.begin(),vecInteger.end(),obj1); std::sort(vecInteger.begin(),vecInteger.end(),obj2); } 

pourquoi obj2 dans la deuxième fonction de sorting entraîne une erreur du compilateur.

Integer obj2() n’est pas la définition d’un object, c’est la déclaration d’une fonction nommée obj2 renvoyant un Integer (placez-la en dehors de toute fonction pour comprendre pourquoi il en est ainsi). Cela se produit aussi parfois avec des constructions plus complexes où cela peut être encore plus déroutant. Certains appellent cela l’ parsing la plus épineuse .

Voici l’exemple promis d’un cas plus complexe:

 struct Foo {}; struct Bar { Bar(Foo); }; Bar quxx(Foo()); // quxx is a function 

Ici, quxx est une fonction renvoyant une barre et prenant (un pointeur) une fonction renvoyant un Foo et sans paramètre. Vous pourriez écrire la même déclaration plus clairement comme ceci:

 Bar quxx(Foo (*fn)()); // quxx is the same function as above 

Pour obtenir la définition d’une variable initialisée avec le constructeur prenant un toto, vous pouvez append un niveau de parenthèse:

 Bar quux((Foo())); // quux is a variable 

Parce que obj2 est une fonction. Voir ce

obj2 n’est pas un BinaryPredicate et n’est pas valide en tant que troisième paramètre de std :: sort

obj2 doit être quelque chose comme

 // Return whether first element is greater than the second bool UDgreater ( int elem1, int elem2 ) { return elem1 > elem2; } 

ou le type de foncteur utilisé par obj1.

Il n’y a pas de définition du constructeur sans argument.

Utilisez, Entier obj2 (0);

 #include #include #include class Integer { public: int m; Integer(int a):m(a){}; bool operator()(const Integer p1,const Integer p2) { return p1.m vecInteger; vecInteger.push_back(Integer(12)); vecInteger.push_back(Integer(13)); vecInteger.push_back(Integer(5)); vecInteger.push_back(Integer(7)); vecInteger.push_back(Integer(9)); Integer obj2(0); std::sort(vecInteger.begin(),vecInteger.end(),obj1); std::sort(vecInteger.begin(),vecInteger.end(),obj2); return 0; } 
 #include #include #include 

classe Integer
{
Publique:
int m;
Entier (int a): m (a) {};
};

class CompareParts {
Publique:
opérateur bool () (const Integer & p1, const Integer & p2)
{
retour p1.m}
};

int main()
{
std :: vector vecInteger;
vecInteger.push_back (Integer (12));
vecInteger.push_back (Integer (13));
vecInteger.push_back (Integer (5));
vecInteger.push_back (Integer (7));
vecInteger.push_back (Integer (9));

 std::sort(vecInteger.begin(),vecInteger.end(),CompareParts()); typedef vector::const_iterator Iter; Iter beg = vecInteger.begin(); Iter end = vecInteger.end(); for (Iter iter = beg; iter != end; ++iter) cout << (*iter).m << " "; cout << endl; 

}

Sortie: 5 7 9 12 13