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

Langage C++ Discussion :

Problème de template & conversion


Sujet :

Langage C++

  1. #1
    Membre extrêmement actif
    Femme Profil pro
    None
    Inscrit en
    Août 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Août 2012
    Messages : 355
    Points : 716
    Points
    716
    Par défaut Problème de template & conversion
    Bonjour,
    j'ai écrit le code suivant :
    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
    34
    35
    36
    37
    38
    39
    template <class TB> class A;
    template <class TA> class B;
     
    template <class TB>
    class A {
    public:
    	A(TB *b) {
    		b->Add(this);
    	}
    };
     
    template <class TA>
    class B {
    public:
    	void Add(TA *a) { 
    		// Do something 
    	}
    };
     
    //////////////////////
    class FooA;
    class FooB;
     
    class FooA : public A<FooB> {
    public:
    	FooA(FooB *b) : A(b) {}
    };
     
    class FooB : public B<FooA> {};
     
    int main() {
    	auto b = new FooB;
    	auto a = new FooA(b);
     
    	delete b;
    	delete a;
     
    	return 0;
    }
    Le problème c'est que celui-ci ne compile pas à caque de l'erreur d'une erreur de conversion ligne 8, il n'arrive pas à convertir A<FooB>* en FooA*, et je n'arrive pas à trouver comment régler ou contourner ce problème (sachant que je ne peux pas me passer des templates à quelque endroit que ce soit).

    Est-ce que quelqu'un aurait une idée à soumettre ?

  2. #2
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Bonjour,

    On peut surement contourner le problème, mais pour ça il faut connaitre l'objectif du code. L'idée est général est que le type de this n'est pas le bon par rapport à celui du paramètre de Add. Il faut donc soit changer le type du paramètre de Add, faisable en rajoutant un paramètre template à B (ou templaté Add, voir message d'Ehonn), soit savoir vers quoi convertir this ce qui est faisable en rajoutant un paramètre template à A. A toi de nous dire quel est le but du code pour que l'on sache la marche de manœuvre dont on dispose.

  3. #3
    Membre chevronné Avatar de Ehonn
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2012
    Messages
    788
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 34
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2012
    Messages : 788
    Points : 2 160
    Points
    2 160
    Par défaut
    Bonjour

    Ceci règle le souci (mais je ne sais pas si c'est ce que tu veux).

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    template <class T>
    class B
    {
    public:
     
    	template <class U>
    	void Add(U * a)
    	{
    		// Do something
    	}
    };
    Edit : Grillé !

  4. #4
    Membre extrêmement actif
    Femme Profil pro
    None
    Inscrit en
    Août 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Août 2012
    Messages : 355
    Points : 716
    Points
    716
    Par défaut
    EN fait le code que j'ai fourni est une version simplifiée du système que je voulais faire. Je travail sur un système de Graph avec 2 classes:
    • GraphLink<TNode>
    • GraphNode<TContent, TLink>


    Et le but c'est évidemment que les deux classes puissent être override pour ajouter des comportements et des informations. Et donc la méthode Add permet d'ajouter un nouveau Link à un noeuds.
    Pour être plus clair mettons que je veuille faire un graphe avec des noeuds contentant un entier, et que les liens contienne la distance entre les deux noeuds :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    class DistanceLink;
     
    class IntNode : public GraphNode<int, DistanceLink> {};
     
    class DistanceLink : public GraphLink<IntNode> {
    // Things
     
    unsigned Distance() {
    auto d = node1->GetConten() - node2->GetContent();
    return d < 0 ? -d : d;
    }
    };
    Du coup la classe GraphNode content un vector<TLink>, donc même en ajoutant un template à la méthode Add ça ne ferait que déplacer le problème.

  5. #5
    En attente de confirmation mail

    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2004
    Messages
    1 391
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : France, Doubs (Franche Comté)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 1 391
    Points : 3 311
    Points
    3 311
    Par défaut
    Tu peux rajouter un template à GraphLink ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    template<class TNode, class TLink>
    struct GraphLink {
    	GraphLink(TNode& node)
    	{ node.add(static_cast<TLink&>(*this)); }
    };

  6. #6
    Membre extrêmement actif
    Femme Profil pro
    None
    Inscrit en
    Août 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Août 2012
    Messages : 355
    Points : 716
    Points
    716
    Par défaut
    Ha ça a réglé mon problème en effet. Par contre j'en ai un autre problème qui est apparu.

    En l'état actuel j'ai donc ces deux classes :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class IntNode;
     
    class DistanceLink : public GraphLink<IntNode, DistanceLink> {...};
    class IntNode : public GraphNode<int, DistanceLink> {...};
    Pour pouvoir faire des opérations opérations sur les links sans connaitre précisemment leur type j'ai fais un typedef dans la classe GraphNode, de la manière suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    class GraphNode<typename TContent, class TLink> {
    public:
        typedef TLink MyLink;
    };
    j'ai ensuite une méthode Connect :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template <class TNode>
    TNode::MyLink* Connect(TNode *n1, TNode *n2) { return new TNode::MyLink(n1, n2); }
    Et cette fois-ci j'ai l'erreur suivante : "spécificateur de type manquant". En clair il ne considère pas TNode::MyLink comme étant un type, et je ne comprend pas pourquoi.

  7. #7
    Expert éminent sénior

    Femme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2007
    Messages
    5 189
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Juin 2007
    Messages : 5 189
    Points : 17 141
    Points
    17 141
    Par défaut
    ajoute typename

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template <class TNode>
    typename TNode::MyLink* Connect(TNode *n1, TNode *n2) { return new typename TNode::MyLink(n1, n2); }
    Cependant, passer par des pointeurs me semble un peu délicat.
    Un lien ne change à priori pas de noeud, et relie systématiquement deux noeuds.

    J'aurais plutot pris des références.
    Mes principes de bases du codeur qui veut pouvoir dormir:
    • Une variable de moins est une source d'erreur en moins.
    • Un pointeur de moins est une montagne d'erreurs en moins.
    • Un copier-coller, ça doit se justifier... Deux, c'est un de trop.
    • jamais signifie "sauf si j'ai passé trois jours à prouver que je peux".
    • La plus sotte des questions est celle qu'on ne pose pas.
    Pour faire des graphes, essayez yEd.
    le ter nel est le titre porté par un de mes personnages de jeu de rôle

  8. #8
    Membre extrêmement actif
    Femme Profil pro
    None
    Inscrit en
    Août 2012
    Messages
    355
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : France

    Informations professionnelles :
    Activité : None

    Informations forums :
    Inscription : Août 2012
    Messages : 355
    Points : 716
    Points
    716
    Par défaut
    Effectivement j'avais oublié le typename. Merci.

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

Discussions similaires

  1. [POO] Problème de template
    Par T0xF0x dans le forum Langage
    Réponses: 4
    Dernier message: 05/07/2006, 13h36
  2. [xslt][Javascript] Problème de templates
    Par Dnallabar dans le forum XSL/XSLT/XPATH
    Réponses: 2
    Dernier message: 03/11/2005, 11h55
  3. problème classes templates...
    Par youp_db dans le forum C++
    Réponses: 3
    Dernier message: 02/11/2005, 13h04
  4. Réponses: 3
    Dernier message: 22/03/2005, 09h13

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