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

C++ Discussion :

Référence indéfinie [encore une :( ]


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut Référence indéfinie [encore une :( ]
    Bonjour à tous.

    Et voilà, j'ai encore un problème de référence indéfinie dans un mon applic. Je ne sais pas d'où elle vient, et c'est pour cela que je me tourne vers des personnes qui n'ont pas encore vu le code des semaines durant du matin au soir, peut être que vous trouverez l'erreur en 2 minutes, parce que moi, plus moyen, je vois des erreurs où il n'y en a pas.

    L'erreur que je reçois lors de la compilation est la suivante:

    ./objs/main.o: dans la fonction « main »:
    main.cxx: (.text+0xf3f): référence indéfinie vers « Vecteur<membrepersonnel*>::Vecteur(int)»
    collect2: ld returned 1 exit status
    make: *** [all] Erreur 1
    Je commencerais donc par le :
    - main.cxx

    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
     
    // déclaration du vecteur de membre de personnel
    Vecteur<membrepersonnel *> VMP(10);
     
    // déclaration et init du vecteur d'occupation
    int vOQPApp[20];
    for( int i = 0; i < 20; i++)
    {
    	vOQPApp[i] = 0;
    }
     
    // ajout d'une personne dans le vecteur ( avec imp un compteur de personne )
    VMP[imp] = new membrepersonnel();
    VMP[imp]->insert();
    imp++;
    Voici maintenant ma classe vecteur:

    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
     
    #ifdef ...
    #...
     
    template <class T> class Vecteur
    {
    private:
    	T *Data;
    	int nbrElem;
    	int *Index;
    public:
    	// constructeur
    	// d'initialisation
    	Vecteur(int n = 20 );
     
    	// destructeur
    	~Vecteur(void)
    	{
    		delete[] Data;
    	}
     
    	// methodes d'acces au variables et de construction d'index
    	T& operator[](int i){ return *(Data+i);};
    	int placelibre();
    	void setindex(int N, int NV){	Index[N] = NV; }
    	int getindex(int N){	return Index[N];	}
     
    };
    #endif
    La définissions des méthodes de cette classe:

    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
     
    #include"Vecteur.h"
     
    template <class T>
    Vecteur<T>::Vecteur( int n )
    {
    	Data = new T[n];
    	nbrElem = n;
     
    	Index = new int[n];
    	for( int i = 0; i < n; i++)
    		Index[i] = 0;
    }
     
    template <class T>
    int Vecteur<T>::placelibre()
    {
    	int i;
    	for( i = 0; i<nbrElem && Index[i] != 0; i++);
     
    	if( i >= nbrElem )
    		i = -1;
    	return i;
    }
     
    template class Vecteur<piecemusee>;
    template class Vecteur<piecemuseeart>;
    template class Vecteur<int>;
    template class Vecteur<membrepersonnel>;
    Voilà, je pense que je n'ai rien oublier de mentionner plus haut. Si je comprend bien l'erreur qu'il me donne, c'est qu'il ne trouve pas la méthode me permettant de construire un vecteur de pointeur de "membrepersonnel" en lui assignant une taille fixe, non?

    Quelqu'un aurait-il une idée à ce sujet? Merci d'avance pour tout les petits trucs et astuces et solutions probable que vous pourrez me fournir.

    Sur ce, bonne journée, bon travaille pour ceux qui ne sont pas en vacances, et bonne vacances pour les autres.

    Encore merci,

    Richard_sraing

    ps.: en relisant le message, je pense avoir trouver d'où vient l'erreur, mais je ne sais pas comment y remédier. Je pense qu'elle se situe au niveau du constructeur de la classe Vecteur, est ce que je ne dois pas faire un truc du genre:

    Vecteur<type>(int n = 20 );
    ??

  2. #2
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Ton problème ne viendrait pas de là par hasard : http://c.developpez.com/faq/cpp/?pag...VERS_templates

  3. #3
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    Donc MatRem, si je comprend bien, je devrais placer à la fin du la déclaration de ma classe Vecteur, soit l'include de mon fichier dans lequel se trouve le code de mes méthodes, soit tout placer dans le même fichier?

    Pourtant pour les autres classes utilisant les template, je n'ai pas procéder de la sorte, et ça marche très bien.

    Je ne sais pas si ça change quelque chose le fait d'être sous une Open Suse 10.1 ?

    Ou alors, je dois peut être enlever le fichier Vecteur.cxx de mon makefile, afin de ne pas le compiler. Mais ce qui est bizarre, c'est que pour cette classe, je procède de la même façon que pour les autres que j'ai déjà déclarée

  4. #4
    Membre éclairé Avatar de richard_sraing
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Avril 2005
    Messages
    483
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Responsable de service informatique
    Secteur : Administration - Collectivité locale

    Informations forums :
    Inscription : Avril 2005
    Messages : 483
    Par défaut
    Oui Silvain, je viens de remarquer que à la fin de mon Vecteur.cxx, je fait bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template class Vecteur<membrepersonnel>;
    mais que en fait je dois mettre
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    template class Vecteur<membrepersonnel *>;
    A la compilation tout passe maintenant.

    Merci d'avoir attirer mon attention la dessus...

    Vous êtes les gars.

  5. #5
    Membre émérite Avatar de MatRem
    Profil pro
    Inscrit en
    Décembre 2002
    Messages
    750
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2002
    Messages : 750
    Par défaut
    Ha oui effectivement, je n'avais pas vu que tu instanciais explicitement tes classes templates.
    Dans ce cas tu n'as pas besoin de faire comme dans la FAC.

    Cependant, pour un gros projet ça peut être pénible d'instancier manuellement la centaine ( ) de Vecteur<T> différents.
    Aussi, pour créer un bibliothèque cette technique posera des problèmes d'édition des liens.

  6. #6
    Membre émérite

    Profil pro
    Inscrit en
    Septembre 2006
    Messages
    717
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2006
    Messages : 717
    Par défaut
    Tu utilise une classe template non instanciée (Vecteur<membrepersonnel*>).

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

Discussions similaires

  1. Encore une question sur les références
    Par bouba dans le forum C++
    Réponses: 7
    Dernier message: 19/02/2007, 14h16
  2. problème de références _ptr dans une map STL
    Par Mr_Tyu dans le forum CORBA
    Réponses: 1
    Dernier message: 10/08/2004, 10h39
  3. Encore une question sur malloc
    Par IG88 dans le forum C
    Réponses: 5
    Dernier message: 23/06/2004, 15h35
  4. Encore une requête complexe sur plusieurs tables
    Par DenPro dans le forum Langage SQL
    Réponses: 5
    Dernier message: 09/12/2003, 19h05

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