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...
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’
________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
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 :
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.
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?
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/portfoliohttp://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question