Tableau d'équivalence : pair, templates [Résolu]

Messages postés
47
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 décembre 2012
- - Dernière réponse : wilvart
Messages postés
47
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 décembre 2012
- 27 avril 2012 à 14:58
Salut !

Je dois créer une table d'équivalence pour un projet. Pour la faire, j'ai pensé utiliser des pair<> pour stocker une équivalence (et dans un second temps un vector> pour stocker toutes mes équivalence). Celle-ci pouvant être de type int/int, double/int ect... l'utilisation des templates me parait normale.

C'est là que ça devient dur... Je n'avais pas encore eu le temps de définir les méthodes dont j'allais avoir besoin que mon compilo s'était déjà mit à crier...


.hpp
#ifndef EQUIVALENCE_OBJECT_HPP
#define EQUIVALENCE_OBJECT_HPP

#include 

template<typename T1, typename T2>
class EquivalenceObject
{
public:
EquivalenceObject();
EquivalenceObject(T1 v1, T2 v2);
    void add(T1 v1, T2 v2);

    private:
pair<T1, T2> eqTable;   ============== Ligne 15
};


#endif



.cpp
#include "equivalenceObject.hpp"
#include 

template<typename T1, typename T2>
EquivalenceObject<T1, T2>::EquivalenceObject()
{
EquivalenceObject<T1, T2>::eqTable new pair<T1, T2>();   Ligne 7
}

template<typename T1, typename T2>
EquivalenceObject<T1, T2>::EquivalenceObject(T1 v1, T2 v2)
{
EquivalenceObject<T1, T2>::eqTable new pair<T1, T2>(v1, v2);   Ligne 13
}

template<typename T1, typename T2>
void EquivalenceObject<T1, T2>::add(T1 v1, T2 v2)
{
EquivalenceObject<T1, T2>::eqTable.first = v1;
EquivalenceObject<T1, T2>::eqTable.second = v2;
}



compilo
In file included from src/equivalenceAlgorithm.cpp:1:
src/equivalenceAlgorithm.hpp:15: error: ISO C++ forbids declaration of ‘pair’ with no type
src/equivalenceAlgorithm.hpp:15: error: expected ‘;’ before ‘<’ token
src/equivalenceAlgorithm.cpp: In constructor ‘EquivalenceObject<T1, T2>::EquivalenceObject()’:
src/equivalenceAlgorithm.cpp:7: error: expected type-specifier before ‘pair’
src/equivalenceAlgorithm.cpp:7: error: expected `;' before ‘pair’
src/equivalenceAlgorithm.cpp: In constructor ‘EquivalenceObject<T1, T2>::EquivalenceObject(T1, T2)’:
src/equivalenceAlgorithm.cpp:13: error: expected type-specifier before ‘pair’
src/equivalenceAlgorithm.cpp:13: error: expected `;' before ‘pair’


Une idée de ce qui pourrait se passer?

Merci d'avance!
Afficher la suite 

Votre réponse

6 réponses

Meilleure réponse
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
3
Merci
Bonjour.

Pourrais-tu décrire un peu mieux ton besoin ? Ce que tu cherches à réaliser au final ? Pas sur qu'un vecteur de pair soit forcément la solution.

À noter que tu ne pourras pas mélanger dans un vecteur des pairs de type différents... (et les template n'y changeront rien).

Techniquement, ton erreur n'est pas du aux templates, mais au fait que tu fasses un new sur une variable qui n'est en rien un pointeur.

Tu devrais normalement avoir (attention, je n'ai pas testé):

#ifndef EQUIVALENCE_OBJECT_HPP
#define EQUIVALENCE_OBJECT_HPP

#include 

template<typename T1, typename T2>
class EquivalenceObject
{
public:
    EquivalenceObject();
    EquivalenceObject(T1 v1, T2 v2);
    void add(T1 v1, T2 v2);

private:
   std::pair<T1, T2> _eqTable;
};

#include "EquivalenceObject.hxx"

#endif


EquivalenceObject.hxx (Attention, le code template ne va pas dans un .cpp ! Il va dans un header spécial séparé).
#include 

template<typename T1, typename T2>
EquivalenceObject<T1, T2>::EquivalenceObject()
 : _eqTable()
{
}

template<typename T1, typename T2>
EquivalenceObject<T1, T2>::EquivalenceObject(T1 v1, T2 v2)
 : _eqTable(v1, v2)
{
}

template<typename T1, typename T2>
void EquivalenceObject<T1, T2>::add(T1 v1, T2 v2)
{
// ???
}


PS: Évite les "using namespace", voir: http://0217021.free.fr/portfolio/axel.berardino/articles/bon-usage-using-namespace

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
3
Merci
Cet ID qu'ont les composantes sont des int pour l'instant. Je vais par contre avoir besoin de réutiliser ma classe Equivalence pour d'autre type d'ID dans d'autres méthodes. (Donc pas de mélange de type dans le vector)

Dans ce cas, ta démarche est justifiée.

Tu pourrais m'en dire plus la dessus :
EquivalenceObject.hxx (Attention, le code template ne va pas dans un .cpp ! Il va dans un header spécial séparé).

Un template n'est pas du code. C'est un générateur de code. Lorsqu'il est appelé, il fabrique du code. Comme le code est inexistant, on met cette fabrique de code dans un header et non dans un fichier de code.


Ton code à l'air de marcher à une exception près, pair n'est pas reconnu :

std::pair au lieu de pair ?

PS : Je sais pour les namespace mais j'ai trop de source à modifier pour changer ça, ce sera pour la prochaine promis.

Je comprends. Dans ce cas, laisse les using namespace, mais préfixe bien par std::, la transition te sera plus aisée.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question

Dire « Merci » 3

Quelques mots de remerciements seront grandement appréciés. Ajouter un commentaire

Codes Sources 112 internautes nous ont dit merci ce mois-ci

Commenter la réponse de cptpingu
Messages postés
47
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 décembre 2012
0
Merci
Pour te donner une vision d'ensemble, j'ai récupéré, depuis une image, toutes les composantes connexes (des vector<vector>). Certaines de ces composantes appartiennent à la même forme mais la première couche d'algo n'a pas réussi à les détécter correctement. J'ai donc une deuxième méthode qui me permet de retrouver les liens entre les composantes.
Je besoin de stocker les équivalence entre mes composantes pour ensuite les labéliser de la même façon.

J'utilise pair car mes équivalences sont entre 2 composantes (elles ont toutes un ID).
Un vector de pair pour avoir toutes mes équivalences?

Cet ID qu'ont les composantes sont des int pour l'instant. Je vais par contre avoir besoin de réutiliser ma classe Equivalence pour d'autre type d'ID dans d'autres méthodes. (Donc pas de mélange de type dans le vector)


Tu pourrais m'en dire plus la dessus :
EquivalenceObject.hxx (Attention, le code template ne va pas dans un .cpp ! Il va dans un header spécial séparé).



J'ai un peu honte de ça oui...
Techniquement, ton erreur n'est pas du aux templates, mais au fait que tu fasses un new sur une variable qui n'est en rien un pointeur.




Ton code à l'air de marcher à une exception près, pair n'est pas reconnu :
#include 
template<typename T1, typename T2>
class EquivalenceObject
{
public:
EquivalenceObject();
EquivalenceObject(T1 v1, T2 v2);

    private:
pair<T1, T2> _eqTable;
};


src/equivalenceAlgorithm.hpp:14: error: ISO C++ forbids declaration of ‘pair’ with no type
src/equivalenceAlgorithm.hpp:14: error: expected ‘;’ before ‘<’ token
src/equivalenceAlgorithm.cpp: In constructor ‘EquivalenceObject<T1, T2>::EquivalenceObject()’:
src/equivalenceAlgorithm.cpp:6: error: class ‘EquivalenceObject<T1, T2>’ does not have any field named ‘_eqTable’
src/equivalenceAlgorithm.cpp: In constructor ‘EquivalenceObject<T1, T2>::EquivalenceObject(T1, T2)’:
src/equivalenceAlgorithm.cpp:11: error: class ‘EquivalenceObject<T1, T2>’ does not have any field named ‘_eqTable’



PS : Je sais pour les namespace mais j'ai trop de source à modifier pour changer ça, ce sera pour la prochaine promis.
Commenter la réponse de wilvart
Messages postés
47
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 décembre 2012
0
Merci
J'ai toujours pas compris l'histoire des templates dans le .hxx. On y met quoi dans ce fichier?


Le std::pair fonctionne, je n'avais pas fait le lien entre mon header contenant le using namespace et celui-ci.


Une dernière question et j'arrête :D
Lorsque je veux créer un objet de type EquivalenceObject dans un main quelconque, j'include mon .hpp et j'écris ça n'est-ce pas?
EquivalenceObject eqTable;
Commenter la réponse de wilvart
Messages postés
3832
Date d'inscription
dimanche 12 décembre 2004
Statut
Modérateur
Dernière intervention
3 avril 2019
163
0
Merci
J'ai toujours pas compris l'histoire des templates dans le .hxx. On y met quoi dans ce fichier?

.hh ou .hpp => Déclaration de code.
.cc ou .cpp => Ton implémentation du code.
.hxx => Les templates et méthodes "inlinées" (tout ce qui génère du code).

A la base, les templates se mettent dans un header et non dans un fichier de code. Mais comme mélanger déclaration et code c'est sale, on crée un deuxième header spécial pour les templates, qui est inclu par le premier header. Le premier header (.hh/.hpp) contient la déclaration de code, tandis que le 2ème header (.hxx) inclu à la fin du premier, contient le code des templates.

Lorsque je veux créer un objet de type EquivalenceObject dans un main quelconque, j'include mon .hpp et j'écris ça n'est-ce pas?
EquivalenceObject eqTable;

Oui.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
Commenter la réponse de cptpingu
Messages postés
47
Date d'inscription
samedi 7 janvier 2006
Statut
Membre
Dernière intervention
13 décembre 2012
0
Merci
Merci !
Commenter la réponse de wilvart

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.