IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

 C++ Discussion :

Problème de conversion lors d'une insertion d'un objet à partir d'une liste vers un vecteur


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut Problème de conversion lors d'une insertion d'un objet à partir d'une liste vers un vecteur
    Bonjour,

    Dans la fonction ci-dessous, j'obtiens l'erreur suivante à la compilation :
    "error C2664: 'std::_Vector_iterator<_Myvec> std::vector<_Ty>::insert(std::_Vector_const_iterator<_Myvec>,_Ty &&)' : impossible de convertir le paramètre 2 de 'Employe' en 'Cadre &&'"

    Je suis allé voir dans le FAQ et les tutos si je n'y trouvais pas rapidement une réponse mais sans succès.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    void Promotion(list<Employe> &tabEmployeL, vector<Cadre> &tabCadreV){
    	vector<Cadre>::iterator iterV;
    	list<Employe>::iterator itMax1E;
    	list<Employe>::iterator itMax2E;
     
    	itMax1E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
     
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	itMax1E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),itMax1E);
    	tabEmployeL.erase(itMax1E);
    	itMax2E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	itMax2E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),itMax2E);
    	tabEmployeL.erase(itMax2E);
    }
    voici les classes Employe et Cadre qui héritent toutes deux de la classe mère Salarie et les paramètres Age sont présents dans les 2.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    class Salarie
    {
    public:
    	void saisie();
    	void affiche();
    protected:
    	string Nom;
    	int Salaire;
    };
     
    class Employe : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    	bool operator < (Employe b);
    	int getAge();
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
     
    class Cadre : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    private:
    	int Age;
    	friend class Actionnaire;
     
    };

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    Bonjour,

    Tu cherches à mettre un Employe dans une liste de Cadre. Ça n'a pas de sens, une instance ne peut pas être Employe et Cadre!
    Pour effectuer une promotion, il faut impérativement créer un nouvelle variable du type Cadre qui sera créée à partir de ce que l'on sait de l'ex-Employe.

  3. #3
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut
    Citation Envoyé par dalfab Voir le message
    Bonjour,

    Tu cherches à mettre un Employe dans une liste de Cadre. Ça n'a pas de sens, une instance ne peut pas être Employe et Cadre!
    Pour effectuer une promotion, il faut impérativement créer un nouvelle variable du type Cadre qui sera créée à partir de ce que l'on sait de l'ex-Employe.
    Merci.
    Donc un container d'instances doit évidemment aussi implicitement ne contenir que des instances de la meme classe (normal puisqu'on le declare comme :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    list<Employe> ListeEmployes_L
    vector<Cadre> ListeCadres_V
    On ne pourrait le faire qu'avec 2 container (list et vector) declares et remplis d'instances de memes classes.
    Evident mais trop pour que je ne l'ai vu. Ce qui m'a induit en erreur c'est l'héritage entre Salarie et Employe et Cadre. Donc bien que Employe et Cadre héritent de Salarie, ce sont effectivement des instances différentes.

  4. #4
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 510
    Par défaut
    A quelle ligne est indiquée l'erreur, SVP ?

  5. #5
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut
    Citation Envoyé par bacelar Voir le message
    A quelle ligne est indiquée l'erreur, SVP ?
    Bonjour 10 et 16, là où j'utilise l'insert dans le vector en essayant d'y faire entrer un Employe dans un vector de Cadre.
    Merci. Daflab a répondu à ma question.
    Je teste ce qu'il m'a conseillé et reviens vers tous.

  6. #6
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut
    Voilà

    La fonction membre pour modifier les données du nouveau cadre sur base des données de l'ancien employé promu :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    void Promouvoir(Employe &E, Cadre &C){
    	string NomTemp;
    	NomTemp=E.getNom();
    	C.setNom(NomTemp);
    	int AgeTemp;
    	AgeTemp=E.getAge();
    	C.setAge(AgeTemp);
    	int SalaireTemp;
    	SalaireTemp=E.getSalaire();
    	C.setSalaire(SalaireTemp);
    }
    Et la fonction promotion:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    void Promotion(list<Employe> &tabEmployeL, vector<Cadre> &tabCadreV){
    	vector<Cadre>::iterator iterV;
    	list<Employe>::iterator itMax1E;
    	list<Employe>::iterator itMax2E;
    	Employe EmployePromu1;
    	Employe EmployePromu2;
    	Cadre CadreTempoPromo1;
    	Cadre CadreTempoPromo2;
     
    	itMax1E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	EmployePromu1=*itMax1E;
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	itMax1E->affiche();
    	Promouvoir(EmployePromu1, CadreTempoPromo1);
    	tabCadreV.insert(tabCadreV.begin(),CadreTempoPromo1);
    	tabEmployeL.erase(itMax1E);
    	itMax2E=max_element(tabEmployeL.begin(),tabEmployeL.end(),cmpAgeEmployes);
    	EmployePromu2=*itMax2E;
    	Promouvoir(EmployePromu2, CadreTempoPromo2);
    	itMax2E->affiche();
    	tabCadreV.insert(tabCadreV.begin(),CadreTempoPromo2);
    	tabEmployeL.erase(itMax2E);
    	cout<<"LES 2 employés les plus Agés à promouvoir sont :"<<endl;
    	CadreTempoPromo1.affiche();
    	CadreTempoPromo2.affiche();
    	}
    Elle n'est sûrement pas optimale (trop de variables, une méthode très basique pour tirer les 2 employés les plus âgés) et ne permet pas d'introduire dans l'ordre alphanumérique les nouveaux cadres dans le vecteur (dû à la méthode douteuse pour retrouver les 2 plus âgés).

    Si quelques a quelques conseils pour une meilleure méthode afin d'optimiser le code cette fonction (en restant avec des choses basiques de mon niveau bien sûr), ils sont les bienvenus.

  7. #7
    Expert confirmé
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2005
    Messages
    5 510
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Conseil

    Informations forums :
    Inscription : Février 2005
    Messages : 5 510
    Par défaut
    Heu, pourquoi ne pas avoir un constructeur de "Cadre" 'explicite' qui prend en paramètre une référence temporaire de "Employe".
    Vous n'aurez pas à construire des Cadre au préalable, vous pouvez "vampiriser" l'"Employe" passé en paramètre et le 'explicite' évitera de faire cette promotion sans le vouloir vraiment.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    class Cadre : public Salarie
    {
    public:
    	void saisie();
    	void affiche();
    ...
            explicit Cadre(Employe&& employe):Age(employe.Age),Nom(employe.Nom){};
    ....
    private:
    	int Age;
    	friend class Actionnaire;
     
    };
    EDIT :
    explicite

  8. #8
    Membre averti
    Homme Profil pro
    Maintenance Prédictive
    Inscrit en
    Mars 2017
    Messages
    39
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : Belgique

    Informations professionnelles :
    Activité : Maintenance Prédictive
    Secteur : Transports

    Informations forums :
    Inscription : Mars 2017
    Messages : 39
    Par défaut
    Merci,

    Constructeur par paramètres je connais mais je ne maîtrise pas bien, explicite je ne connais pas du tout.
    Par contre juste avec un constructeur par paramètres, y a t'il moyen de se débrouiller sans le explicit ?

    La notion de constructeur de copie est-elle utile ici ?

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 1
    Dernier message: 01/07/2015, 11h17
  2. Réponses: 3
    Dernier message: 28/11/2011, 14h34
  3. Réponses: 2
    Dernier message: 02/09/2010, 09h59
  4. [Unitils] [TestNG][DBUnit][JPA][Hibernate] problème de sequence lors d'un insert.
    Par Faiche dans le forum Tests et Performance
    Réponses: 1
    Dernier message: 19/10/2009, 16h39
  5. [Système] Problème de doublon lors d'un insert (voir fin)
    Par gregory.bts dans le forum Langage
    Réponses: 7
    Dernier message: 04/08/2007, 03h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo