Question

#include<iostream>
#include<vector>
#include<algorithm>
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<Integer> 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 est obj2 en deuxième fonction de tri conduit à une erreur du compilateur.

Était-ce utile?

La solution

Integer obj2() est pas à la définition d'un objet, il est la déclaration d'une fonction nommée obj2 retour d'un Integer (mettre en dehors de toute fonction de comprendre pourquoi il est si). Cela se produit parfois avec des constructions plus complexes où il peut être encore plus confus. Un nom ce parse le plus contrariant .

Voici l'exemple d'un cas avait promis plus complexe:

struct Foo {};
struct Bar { Bar(Foo); };

Bar quxx(Foo()); // quxx is a function

Ici quxx est une fonction qui retourne un bar et prendre (un pointeur) à une fonction renvoyant un Foo et sans paramètres. Vous pouvez écrire plus clairement la même déclaration 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 en prenant un Foo, vous pouvez ajouter un niveau de parenthèses:

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

Autres conseils

Parce que obj2 est une fonction. Voir cette

obj2 n'est pas un BinaryPredicate et est invalide comme troisième paramètre à 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ée par OBJ1.

Il n'y a pas de définition d'aucun constructeur argument.

Utilisation, Integer obj2 (0);

#include<iostream>
#include<vector>
#include<algorithm>
class Integer
{
     public:
     int m;
     Integer(int a):m(a){};
     bool operator()(const Integer p1,const Integer p2)
     {
      return p1.m<p2.m;
     }
};
class CompareParts
{    public:
     bool     operator()(const Integer  p1,const Integer p2)
     {
         return p1.m<p2.m;
         }
}obj1;

int main()
{
    std::vector<Integer> 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<iostream>
#include<vector>
#include<algorithm>

class entier
{
public:
    int m;
    Entier (int a): m (a) {};
};

classe CompareParts {
public:
    bool operator () (const Entier & p1, const Entier & p2)
    {
        retour p1.m     }
};

int main ()
{
    std :: vecteur 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<Integer>::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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top