Référence indéfinie en C++

Fermé
LordWhiro - 9 janv. 2010 à 15:04
LordWhiro Messages postés 20 Date d'inscription samedi 9 janvier 2010 Statut Membre Dernière intervention 12 juin 2010 - 22 mai 2010 à 20:32
Bonjour,

J'ai un gros problème concernant un petit programme en C++ que je développe. Je précise que je débute en C++ et que c'est mon premier programme de + de 100 lignes de code.
C'est une erreur d'éditeur de liens (celui de GCC) : référence indéfinie. La compilation marche très bien.
En fait avant j'avais mon programme dans un seul fichier .cpp mais pour des raisons de commodité, devenant gros, je devais le fractionner en un header .hpp et 3 fichiers .cpp . C'est depuis lors que cette erreur intervient, avec TOUTES MES FONCTIONS MEMBRES (pas seulement celle que je vais vous donner en exemple).

Voici l'erreur :
C:\Users\xxxxx\AppData\Local\Temp/cctR4xIw.o:SudoGen.cpp:(.text+0x142): référence indéfinie vers « element<6u>::getValue() »


Et voici le code (épuré de toutes les autres fonctions que getValue).
Dans mon header, ".\include\main.hpp"
template<unsigned n> class element
{   public :
   unsigned getValue();
    private:
   unsigned number;
}


Dans un .cpp annexe contenant l'implémentation de la classe element<n>, appelé ".\element.cpp" :
#include "include\main.hpp"

template<unsigned n> unsigned element<n>::getValue() {
     return number;
}


Dans le .cpp principal du programme, appelé ".\Sudogen.cpp"
#include <iostream>
#include "include\main.hpp"

using namespace std;

int main() {
    element<6> test = 42;
    /* J'ai surchargé l'opérateur "=" pour affecter 42 au membre privé "number" de l'objet test. */
    cout << test.getValue() << endl;
}


Voilà, merci mille fois d'avance à celui qui réussira à me tirer de ce pétrin c'est mon ultime espoir j'ai tout essayé avant de poster ici (google, livres, même dans "la langage c++" de bjarne stroustrup j'ai pas trouvé).

Whiro

6 réponses

Pacorabanix Messages postés 3248 Date d'inscription jeudi 23 août 2007 Statut Membre Dernière intervention 19 mai 2013 660
9 janv. 2010 à 18:31
en attendant que quelqu'un de plus compétent que moi te réponde : essaye déjà de mettre tous les fichiers dans le répertoire de base (sans passer par le répertoire "include" que tu as crée).

De plus, c'est une très bonne chose d'avoir fractionné tes fichiers. Habituellement on fait même ceci : on crée toujours deux fichiers, un .cpp et un .hpp. (sauf peut-être pour le programme principal, le fichier qui contient main() )

Ainsi, les fichiers qui utilisent qq'chose d'un autre fichier incluent son header (.hpp), et c'est seulement le .hpp qui inclut le .cpp .

De plus, il faudrait éviter d'inclure trop de fois le même fichier :

on utilise les #ifndef et les #define

Ex :

On a 3 fichiers :
Prog.cpp F1.cpp, F2.cpp et leurs headers respectifs F1.hpp, F2.hpp

prog.cpp contiendra:
#include "F1.hpp"
#include "F2.hpp"

F1.hpp contiendra

#ifndef F1_HPP // cette variable de compilation sert à ne pas inclure deux fois le fichier
#define F1_HPP // la 1ere fois que le fichier est inclu on définit cette variable comme ça le fichier ne sera plus lu, à cause de la ligne au dessus.

/* ton code */

#endif


F1.cpp contiendra :
#include "F1.hpp"
/* le reste du code */


idem pour F2.



sinon tu ne devrais pas mettre ,je pense, de nom de dossier dans les chemins, ça cause facilement des erreurs je suppose. Ceci est plutot à régler dans les options de ton compilateur / environnement de développement (lui dire de chercher les fichiers dans un sous-répertoire "include" ou "sources"...)
2