Tableau d'équivalence : pair, templates

Résolu
wilvart Messages postés 47 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 décembre 2012 - 26 avril 2012 à 15:34
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!

6 réponses

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 avril 2012 à 16:12
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
3
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 avril 2012 à 17:17
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
3
wilvart Messages postés 47 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 décembre 2012
26 avril 2012 à 16:58
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.
0
wilvart Messages postés 47 Date d'inscription samedi 7 janvier 2006 Statut Membre Dernière intervention 13 décembre 2012
26 avril 2012 à 17:53
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;
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
26 avril 2012 à 20:49
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
0
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
Merci !
0
Rejoignez-nous