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

Linux Discussion :

Template sous unix (cc)


Sujet :

Linux

  1. #1
    Membre habitué

    Inscrit en
    Février 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 61
    Points : 142
    Points
    142
    Par défaut Template sous unix (cc)
    Bonjour,
    J'aimerai compiler une classe gérant des tableaux :
    Mon fichier .h :
    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
    #ifndef __TEMPLATE_TAB
    #define __TEMPLATE_TAB
     
    template <class T>
    class tableau
    {
    	private:
    		T* Elements;
    		int Nombre;
    		T* Allouer(int nb);
     
    	public:
    		int Ajouter(T& valeur);
    		int Supprimer(int index);
    		void SupprimerTout();
    		T& operator [](int index);
    		void operator =(tableau &source);
    		int NombreElement() { return Nombre; }
     
    		tableau();
    		~tableau();
    };
     
    #include "conteneur.C"
    #endif
    Dans conteneur.C j'ai toutes les fonctions membre de la classe.
    Dans mon fichier qui utilise cette classe je fais :
    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
    #include <iostream>
    #include "conteneur.h"
    using namespace std;
     
    int main()
    {
    	tableau<int> VecteurInt;
    	VecteurInt.Ajouter(1);
    	VecteurInt.Ajouter(3);
    	VecteurInt.Ajouter(6);
    	VecteurInt.Ajouter(7);
     
    	for(int i=0; i< VecteurInt.NombreElement(); i++){
    		cout<< VecteurInt[i] << endl;
    	}
            return 0;
    }
    Avec un makefile, je compile et voici l'erreur :
    test-conteneur.C: In function `int main()':
    test-conteneur.C:8: erreur: pas de fonction concordante pour l'appel à « tableau<int>::Ajouter(int) »
    /home/bar/docs/C++/conteneurs/conteneur.C:19: note: candidats sont: int tableau<T>::Ajouter(T&) [with T = int]
    test-conteneur.C:9: erreur: pas de fonction concordante pour l'appel à « tableau<int>::Ajouter(int) »
    /home/bar/docs/C++/conteneurs/conteneur.C:19: note: candidats sont: int tableau<T>::Ajouter(T&) [with T = int]
    test-conteneur.C:10: erreur: pas de fonction concordante pour l'appel à « tableau<int>::Ajouter(int) »
    /home/bar/docs/C++/conteneurs/conteneur.C:19: note: candidats sont: int tableau<T>::Ajouter(T&) [with T = int]
    test-conteneur.C:11: erreur: pas de fonction concordante pour l'appel à « tableau<int>::Ajouter(int) »
    /home/bar/docs/C++/conteneurs/conteneur.C:19: note: candidats sont: int tableau<T>::Ajouter(T&) [with T = int]
    make: *** [test-conteneur] Erreur 1
    Je ne comprend pas très bien?!

  2. #2
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Rien a voir avec les templates (en général, avant d'essayer de faire un template, il est intéressant d'avoir du code qui marche pour un type donne, après on peut en faire un template). Le problème est que Ajouter prend comme argument une référence non constante et que tu essaies de lui passer un temporaire, ce qui n'est pas permis.

  3. #3
    Membre habitué

    Inscrit en
    Février 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 61
    Points : 142
    Points
    142
    Par défaut
    Bonjour,
    Merci pour ta réponse.
    Mais si je bouge la référence alors le programme plante totalement.

    Si je fais,
    int i = 10;
    VecteurInt.Ajouter(i);

    Il plante aussi. Je je déclare Ajouter comme ceci :

    template <class T> tableau<T>::Ajouter(const T& valeur);

    Il ne veut pas non plus. Comment faire?

  4. #4
    Membre expérimenté
    Avatar de Patriarch24
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Septembre 2003
    Messages
    1 047
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

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

    Informations forums :
    Inscription : Septembre 2003
    Messages : 1 047
    Points : 1 640
    Points
    1 640
    Par défaut
    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
     
    #ifndef __TEMPLATE_TAB
    #define __TEMPLATE_TAB
     
    template <class T>
    class tableau
    {
    	private:
    		T* Elements;
    		int Nombre;
    		T* Allouer(int nb);
     
    	public:
    		int Ajouter(T& valeur); // pourquoi pas const T& ?
    		int Supprimer(int index);
    		void SupprimerTout();
    		T& operator [](int index);
    		void operator =(tableau &source);// non non et non. Voir la FAQ sur la redéfinition des opérateurs.
    		int NombreElement() { return Nombre; }
     
    		tableau();
    		~tableau();
    };
     
    #include "conteneur.C"
    #endif
    #edit
    Les commentaires sont dans le code.

    Je je déclare Ajouter comme ceci :
    template <class T> tableau<T>::Ajouter(const T& valeur);
    Qu'est-ce que c'est que ça ?

  5. #5
    Membre habitué

    Inscrit en
    Février 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 61
    Points : 142
    Points
    142
    Par défaut
    Oui, si je met const, il est pas très content :
    /tmp/ccmeqnFK.o: dans la fonction « std::__verify_grouping(char const*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)»:
    test-conteneur.C.text+0xd): référence indéfinie vers « std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const»
    test-conteneur.C.text+0x60): référence indéfinie vers « std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const»
    test-conteneur.C.text+0x9e): référence indéfinie vers « std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const»
    test-conteneur.C.text+0xcc): référence indéfinie vers « std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const»
    /tmp/ccmeqnFK.o: dans la fonction « main »:
    test-conteneur.C.text+0x18a): référence indéfinie vers « std::cout »
    test-conteneur.C.text+0x18f): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >::operator<<(int)»
    test-conteneur.C.text+0x197): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)»
    test-conteneur.C.text+0x19f): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))»
    test-conteneur.C.text+0x1ef): référence indéfinie vers « std::cout »
    test-conteneur.C.text+0x1f4): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >::operator<<(int)»
    test-conteneur.C.text+0x1fc): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >& std::endl<char, std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&)»
    test-conteneur.C.text+0x204): référence indéfinie vers « std::basic_ostream<char, std::char_traits<char> >::operator<<(std::basic_ostream<char, std::char_traits<char> >& (*)(std::basic_ostream<char, std::char_traits<char> >&))»
    /tmp/ccmeqnFK.o: dans la fonction « __static_initialization_and_destruction_0(int, int)»:
    test-conteneur.C.text+0x267): référence indéfinie vers « std::ios_base::Init::Init()»
    /tmp/ccmeqnFK.o: dans la fonction « __tcf_0 »:
    test-conteneur.C.text+0x298): référence indéfinie vers « std::ios_base::Init::~Init()»
    /tmp/ccmeqnFK.o: dans la fonction « tableau<int>::~tableau()»:
    test-conteneur.C.gnu.linkonce.t._ZN7tableauIiED1Ev+0x17): référence indéfinie vers « operator delete[](void*)»
    /tmp/ccmeqnFK.o: dans la fonction « tableau<int>::Ajouter(int const&)»:
    test-conteneur.C.gnu.linkonce.t._ZN7tableauIiE7AjouterERKi+0x89): référence indéfinie vers « operator delete[](void*)»
    /tmp/ccmeqnFK.o: dans la fonction « tableau<int>::Supprimer(int)»:
    test-conteneur.C.gnu.linkonce.t._ZN7tableauIiE9SupprimerEi+0xc3): référence indéfinie vers « operator delete[](void*)»
    /tmp/ccmeqnFK.o: dans la fonction « tableau<int>::Allouer(int)»:
    test-conteneur.C.gnu.linkonce.t._ZN7tableauIiE7AllouerEi+0x10): référence indéfinie vers « operator new[](unsigned int)»
    /tmp/ccmeqnFK.o.eh_frame+0x12): référence indéfinie vers « __gxx_personality_v0 »
    collect2: ld a retourné 1 code d'état d'exécution
    make: *** [test-conteneur] Erreur 1
    Pour ce qui est de l'opérateur, je l'ai mis à la vas vite je l'ai pas encore défini. Pour le moment c'est l'ajout qui me pose problème.

  6. #6
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Utilise g++ et pas gcc pour faire l'édition de liens.

  7. #7
    Membre habitué

    Inscrit en
    Février 2006
    Messages
    61
    Détails du profil
    Informations forums :
    Inscription : Février 2006
    Messages : 61
    Points : 142
    Points
    142
    Par défaut
    Merci beaucoup, ça fonctionne mieux !

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

Discussions similaires

  1. [C++] - Instanciation templates sous Unix (gcc)
    Par vdumont dans le forum Linux
    Réponses: 7
    Dernier message: 15/03/2006, 23h12
  2. [Kylix] Kylix sous UNIX
    Par gRRosminet dans le forum EDI
    Réponses: 3
    Dernier message: 09/11/2004, 17h07
  3. Montage sur Debian de AFPS sous UNIX
    Par Harbaingan dans le forum Administration système
    Réponses: 2
    Dernier message: 14/01/2004, 22h03
  4. Chargement dynamique de DLL sous Unix
    Par Willou dans le forum Autres éditeurs
    Réponses: 7
    Dernier message: 18/12/2002, 18h25

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