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 :

Erreur sur le niveau d'indirection et la conversion dans un template


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 Erreur sur le niveau d'indirection et la conversion dans un template
    Bonjour,

    J'obtiens les messages d'erreurs suivants à la compilation.
    Erreur 1 error C2446: '=='*: pas de conversion de 'const char []' en 'int'
    Erreur 2 error C2040: '=='*: les niveaux d'indirection de 'int' et de 'const char []' sont différents


    Le code complet est en annexe.
    Est-ce que quelqu'un peut m'aider ?
    Merci d'avance.

    Suite au template
    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
    template<class T, class U, class V> int somme(T robot, U iter ,V RB) {
    	U it;
    	int som = 0;
    //	V RB;
    	for (it = robot.begin(); it!=robot.end(); it++){
    		if (it->getCouleur()==RB)
    		{
    			som=som+it->getVal();
    		}
    		else{
    			som=som-it->getVal();
    		}
    	}
    	return som;
    }
    à l'opérateur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    bool boule::operator==(boule Robot1){
    	if (couleur==Robot1.getCouleur())
    	{
    		return true;
    	} else
    	{
    		return 0;
    	}
    }
    faisant usage de la classe
    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
    class boule {
    private:
    	int numero;
    	char couleur;
    public:
    	void saisie();
    	void affiche();
    	bool operator==(boule);
    	int getVal(){
    		return numero;
    	};
    	char getCouleur(){
    		return couleur;
    	}
    };

    et à son appel
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    somme<list<boule>,list<boule>::iterator,const char[2]>(L,itl,"R");
    somme<vector<boule>,vector<boule>::iterator,const char[2]>(V,itv,"B");
    Fichiers attachés Fichiers attachés

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    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 600
    Par défaut
    Bonjour, et bonne année

    Le dernier paramètre est un const char[2], or la fonction getCouleur() retourne un char. On ne peut évidemment pas comparer les deux.
    En plus simple sans les template : if ( "B" == 'B' ) n'a aucun sens.

  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, et bonne année

    Le dernier paramètre est un const char[2], or la fonction getCouleur() retourne un char. On ne peut évidemment pas comparer les deux.
    En plus simple sans les template : if ( "B" == 'B' ) n'a aucun sens.
    Oui merci, bonne année également.
    En effet merci, je ne m'étais pas aperçu du single quote pour la variable char, c'est pourquoi j'avais du écrire const char [2], car j'avais laissé des double quote dans le template.

    Il me reste un souci mais qui je crois est indépendant du template:
    en retournant la variable som après l'appel du template pour la list, je ne sais jamais l'affecter dans le main() dans une autre variable (pourtant un int également) afin de récuper la somme car à la ligne suivante je réappelle le template pour y passer le vector qui va me retourner une autre valeur dans som.
    Or je dois faire le test "som1 >ou< som2" dans le main (c'est l'objet de l'exercice pour maîtriser les passages des variables entre les fonctions et le main).

    Une affectation s'écrit pourtant " var_destination=var_origine" si elles sont de même type ? Non ?

    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
    somme<list<boule>,list<boule>::iterator, char>(L,itl,'R');
    somRobot1=som;
     
    somme<vector<boule>,vector<boule>::iterator, char>(V,itv,'B');
    somRobot2=som;
     
     
    if (somRobot1>somRobot2)
    {
    	cout<<"Le gagnant est Robot1"<<endl;
    }
    if (somRobot1<somRobot2)
    {
    	cout<<"Le gagnant est Robot2"<<endl;
    }
    if (somRobot1==somRobot2)
    {
    	cout<<"Ex aequo"<<endl;
    }

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    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 600
    Par défaut
    Tes exemples sont difficiles à interpréter.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    somme<list<boule>,list<boule>::iterator, char>(L,itl,'R'); // on appelle un fonction somme et on ignore totalement l'entier qu'elle retrourne.
    somRobot1=som;  // on semble copier une instance dans une autre, leur type est ???
     
    somme<vector<boule>,vector<boule>::iterator, char>(V,itv,'B'); // autre résultat ignoré
    somRobot2=som;  // ah, donc somRobot1 == SomRobot2 == som
     
    if (somRobot1>somRobot2)  // on vérifie si un est strictement supérieur à l'autre, A quel moment définit-on ce qui fait
    // qu'un "som" est supérieur à un autre? Si se sont des types simples comme 'int' 'double' ou pointeur 
    // ça a un sens, si ce sont des objets d'un type donné, le type doit fournir ce qu'il faut faire.
    {
    	cout<<"Le gagnant est Robot1"<<endl;
    }
    Maintenant, pour répondre à ta question. Oui, l'opérateur d'affectation existe automatiquement pour tout type si c'est faisable, et le = est le moyen d'y accéder.

  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 dalfab Voir le message
    Tes exemples sont difficiles à interpréter.
    Oui je sais, c'est parce que je ne fournis pas l'énoncé. R, B et N sont des couleurs, propriétés d'une instance Robot1 et Robot2 d'une classe boule (j'aurais du utiliser des string mais dans l'énoncé ce sont des char) et à chaque boule saisie est associée une valeur (un int) que la fonction somme est justement charge calculer individuellement pour une list d'objets Robot1 et pour un vector d'objets Robot2.
    la somme compte les Rouges 'R' du Robot1 et les Bleues 'B' du Robot3 et renvoi individuellement (après appel du template somme pour la list Robot1 et du template somme pour le vector Robot2).

    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    somme<list<boule>,list<boule>::iterator, char>(L,itl,'R'); // on appelle un fonction somme et on ignore totalement l'entier qu'elle retrourne.
    si, l'entier qu'elle retourne est som.

    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    somRobot1=som;  // on semble copier une instance dans une autre, leur type est ???
    int somRobot1
    int som

    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    somme<vector<boule>,vector<boule>::iterator, char>(V,itv,'B'); // autre résultat ignoré
    somRobot2=som;  // ah, donc somRobot1 == SomRobot2 == som
    Non somRobot1 est la variable locale de type int du main() qui doit recevoir le contenu de som retournée par la fonction somme et somRobote est la 2e variable locale de type int du main() qui doit recevoir le contenu de som retournée par la fonction somme. Ensuite dans le main je compare les 2 (voir plus bas).

    Donc même chose qu'à la question ci-dessus, le template nous retourne som avec les paramètres du vecteur, donc j'en affecter le contenu à la deuxième variable somRobot2

    int somRobot2
    int som

    Citation Envoyé par dalfab Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (somRobot1>somRobot2)  // on vérifie si un est strictement supérieur à l'autre, A quel moment définit-on ce qui fait
    // qu'un "som" est supérieur à un autre? Si se sont des types simples comme 'int' 'double' ou pointeur 
    // ça a un sens, si ce sont des objets d'un type donné, le type doit fournir ce qu'il faut faire.
    {
    	cout<<"Le gagnant est Robot1"<<endl;
    }
    Oui somRobot1 et somRobot2 sont 2 variables de même type simple int
    som aussi,mais une fois affecté à l'une des 2 locales au main, je ne m'en sers plus.

    Citation Envoyé par dalfab Voir le message
    Maintenant, pour répondre à ta question. Oui, l'opérateur d'affectation existe automatiquement pour tout type si c'est faisable, et le = est le moyen d'y accéder.
    Oui mais alors pour quelle raison cela ne fonctionne t'il pas ?

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 600
    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 600
    Par défaut
    Relis mes remarques, j'avais bien vu la variable dans la fonction. Mais il n'existe aucune magie qui transfère la valeur d'une variable locale à une fonction dans une autre variable ayant le même nom.

Discussions similaires

  1. Erreur sur titre de page au niveau des tutos
    Par devalender dans le forum MkFramework
    Réponses: 3
    Dernier message: 28/10/2014, 21h25
  2. Réponses: 0
    Dernier message: 21/03/2014, 20h02
  3. [VBS] Erreur sur "AddWindowsPrinterConnection"
    Par Admin dans le forum VBScript
    Réponses: 5
    Dernier message: 27/03/2004, 16h15
  4. []Erreur sur second emploi collection binding
    Par jacma dans le forum VB 6 et antérieur
    Réponses: 2
    Dernier message: 08/03/2004, 18h02
  5. Erreur sur le TNSListener après installation de 9iAS
    Par Patmane dans le forum Installation
    Réponses: 4
    Dernier message: 04/02/2004, 11h16

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