Flux rss
Collection CommentCaMarche.net
Rechercher : dans
Par : Pertinence Date Nom d'utilisateur
Statut : Résolu

[c++ template]undefine reference to ...

guian, le mardi 31 octobre 2006 à 14:21:58
voila je me met a écrire des patron de classe (template) de maniere a définir des class en fonction d'autre classes:



tamplate <class T> class maclasse {
T VarialeDeTypeT;
...
}

et a la compilation j'ai bcp d'erreur qui viennent de mon main et qui me disent toutes :

FichierDuMain.cc l."n°de ligne" undefine reference to : (le constructeur ou la fonction appelée à cette ligne)


j'ai pensé a une erreur dans le contructeur par défaut j'ai essayer de le réécrire sans succé mai vu que c'est la premiere fois que j'utilise les templates je suis pas sur de savoir comment faire ...

est ceque vous connaissez la surce de ces erreurs et comment coriiger svp ?
Répondre à guian  Signaler ce message aux modérateurs Aller au dernier message

1


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le mardi 31 octobre 2006 à 16:51:51
Salut.
Met nous du code concret, pasque là, tu n'es pas clair.
mais disons, que tu as template <class T> class maC{
T a;}
alors, dans le main, tu fait :
maC<int> variable_class;
quel compilateur utilise tu aussi? Salutation !
Char Snipeur
Répondre à Char Snipeur

2


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
guian, le jeudi 2 novembre 2006 à 13:24:42
vous voulez du code en voici ^^ :)
(intégralité du code)
ce code sert a créer et géré une liste chainé. a partir d'un élément on a accé a son suivant et son précédent, et j'utilise des itérateur qui pointe vers un élément pour parcourir la liste :

"liste.h" :


#ifndef LISTE_H
#define LISTE_H
#include <string>
using namespace std;

template <class T> class Element;
template <class R> class Iterateur;

template <class S> class Liste{
private:
// pointeurs vers le premier et le dernier element
Element<S>* premier;
Element<S>* dernier;

public:
//constructeurs
Liste<S>();

//constructeur par recopie
Liste<S>(const Liste<S> &);

//fonction membre copy utilisé par le constructeur par recopie et par l'operateur d'affectation
void copy(const Liste &);

//destructeur
~Liste();

//fonction membre free utilisé par le destructeur et par l'operateur d'affectation
void free();

Liste& operator=(const Liste&);

// ajouter s a la fin de la liste
void ajouter(const S& s);

// ajouter s avant la position pos
void inserer(const Iterateur<S>& pos, const S& s);

// supprimer l'element a la position pos
void supprimer(Iterateur<S>& pos);

// la premiere position
Iterateur<S> debut() const;

// la fin de la liste (apres la derniere position)
Iterateur<S> fin() const;




};


template<class R> class Iterateur
{
public:
// constructeur
Iterateur();

// retourne la valeur dans cette position
R& operator*() const;



// avance a la position suivante
void operator++();

void operator++(int);

// recule a la position precedente
void operator--();

void operator--(int);

// compare deux iterateurs
bool operator==(const Iterateur& b) const;

bool operator!=(const Iterateur& b) const;

private:
// pointeur vers l'element courant
Element<R>* position;

// pointeur vers le dernier element de la liste
Element<R>* dernier;

template <class S> friend class Liste;
};

#endif





"liste.cc" :

#include "liste.h"
#include <string>
#include <iostream>
using namespace std;

template <class T> class Element
{
public:
// constructeur
Element(const T& s);

private:
string valeur;

// pointeurs vers les voisins
Element<T>* precedent;
Element<T>* suivant;

template <class S> friend class Liste;
template <class R> friend class Iterateur;
};


template <class T> Element<T>::Element(const T& s)
{ valeur = s;
precedent = suivant = NULL;
}


template<class R> Iterateur<R>::Iterateur()
{ position = dernier = NULL;
}


template<class R> R& Iterateur<R>::operator*() const
{ return position->valeur;
}



template<class R> void Iterateur<R>::operator++()
{ position = position->suivant;
}

template<class R> void Iterateur<R>::operator++(int inutile)
{ position = position->suivant;
}

template<class R> void Iterateur<R>::operator--()
{ if (position == NULL) // fin de la liste
position = dernier;
else
position = position->precedent;
}

template<class R> void Iterateur<R>::operator--(int)
{ if (position == NULL) // fin de la liste
position = dernier;
else
position = position->precedent;
}

template<class R> bool Iterateur<R>::operator==(const Iterateur& b) const
{ return position == b.position;
}

template<class R> bool Iterateur<R>::operator!=(const Iterateur& b) const
{ return position != b.position;
}


Liste::Liste()
{ premier = dernier = NULL;
}
template<class S> Liste<S>::Liste()
{ premier = dernier = NULL;
}

template<class S> Liste<S>::Liste(const Liste<S> &l){

copy(l);

}

template<class S> void Liste<S>::copy(const Liste<S> &l){
premier = dernier = NULL;
Iterateur<S> pos;
for (pos =(l.debut()); pos!=(l.fin()); pos++){
ajouter(*pos);
}
}

template<class S> Liste<S>::~Liste(){
free();
}

template<class S> void Liste<S>::free(){
Iterateur<S> pos;
for (pos =debut(); pos!=fin(); pos++){
delete(pos.position);
}
}

template<class S> Liste<S>& Liste<S>:: operator=(const Liste &l){
if(this !=&l){
free();
copy(l);
}
return *this;
}


template<class S> Iterateur<S> Liste<S>::fin() const
{ Iterateur<S> it;
it.position = NULL;
it.dernier = dernier;
return it;
}

template<class S> void Liste<S>:: ajouter(const S& s){
Element<S> *e=new Element<S>(s);

if(dernier==NULL){
dernier=premier=e;
}
else {
e->precedent =dernier;
dernier->suivant=e;
dernier=e;
}
}

template<class S> void Liste<S>:: inserer(const Iterateur<S> &pos, const S& s){
Element<S> *e=new Element<S>(s);


if(pos.position == premier){
premier->precedent=e;
e->precedent=NULL;
e->suivant=premier;
premier=e;
}
else if(pos.position==NULL){

dernier->suivant=e;
e->suivant=NULL;
e->precedent=dernier;
dernier=e;
}
else{
e->precedent =pos.position->precedent;
e->suivant=pos.position;
(pos.position)->precedent->suivant=e;
(pos.position)->precedent=e;

}
}

template<class S> void Liste<S>::supprimer(Iterateur<S>& pos){
if(pos.position==NULL){
cout<<"\n la liste est vide ! ou la position indiquée est NULL :\n rien à supprimer\n"<<endl;
}
else if(pos.position == premier){
Iterateur<S> tmp=pos;
++pos;
premier->suivant->precedent=NULL;
premier=premier->suivant;
delete tmp.position;

}
else if(pos.position == dernier){
Iterateur<S> tmp=pos;
++pos;
dernier->precedent->suivant=NULL;
dernier=dernier->precedent;
delete tmp.position;
}
else{
Iterateur<S> tmp=pos;
++pos;
(tmp.position)->precedent->suivant=(tmp.position)->suivant;
(tmp.position)->suivant->precedent=(tmp.position)->precedent;
delete tmp.position;
}
}





"test_list.cc" (main)


#include <string>
#include <list>
#include "liste.h"
#include <iostream>
using namespace std;

int main(){

Liste<int> personnel;
Iterateur<int> pos;

// ajouter 4 elements
personnel.ajouter(12);
personnel.ajouter(17);
personnel.ajouter(15);
personnel.ajouter(27);

// test du constructeur par recopie
Liste<int> toto(personnel);

// inserer un element a la quatrieme position
pos = toto.debut();

pos++;
pos++;
pos++;


toto.inserer(pos, 77);


// supprimer l'element a la deuxieme position
pos = toto.debut();
pos++;
toto.supprimer(pos);

// afficher tous les elements
for (pos = toto.debut(); pos!=(toto.fin()); ++pos)
cout << *pos << endl;

//test de l'operateur d'affectation
Liste<int> toto2;
toto2=toto;

cout << "\n\ndeuxième affichage :"<< endl;

for (pos = toto2.debut(); pos!=(toto2.fin()); ++pos)
cout << *pos << endl;


// personnel.~Liste();
// toto.~Liste();
// toto2.~Liste();

return 0;
}




voila le tout compiler grace a ce makefile simplissime :


liste: liste.o test_list.o
g++ -o liste liste.cc test_list.cc liste.h

liste.o: liste.cc liste.h
g++ -o liste.o -c liste.cc liste.h

test_list.o: test_list.cc liste.cc liste.h
g++ -o test_list.o -c test_list.cc liste.h




^^ bonne lecture
Répondre à guian

3


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
guian, le lundi 6 novembre 2006 à 08:13:51
et voila le résultat de la compilation :


g++ -c liste.cc
g++ -c test_list.cc
g++ -o liste liste.o test_list.o
test_list.o(.text+0x1b): In function `main':
: undefined reference to `Liste<int>::Liste[in-charge]()'
test_list.o(.text+0x26): In function `main':
: undefined reference to `Iterateur<int>::Iterateur[in-charge]()'
test_list.o(.text+0x3f): In function `main':
: undefined reference to `Liste<int>::ajouter(int const&)'
test_list.o(.text+0x58): In function `main':
: undefined reference to `Liste<int>::ajouter(int const&)'
test_list.o(.text+0x71): In function `main':
: undefined reference to `Liste<int>::ajouter(int const&)'
test_list.o(.text+0x8a): In function `main':
: undefined reference to `Liste<int>::ajouter(int const&)'
test_list.o(.text+0x9c): In function `main':
: undefined reference to `Liste<int>::Liste[in-charge](Liste<int> const&)'
test_list.o(.text+0xae): In function `main':
: undefined reference to `Liste<int>::debut() const'
test_list.o(.text+0xd0): In function `main':
: undefined reference to `Iterateur<int>::operator++(int)'
test_list.o(.text+0xe3): In function `main':
: undefined reference to `Iterateur<int>::operator++(int)'
test_list.o(.text+0xf6): In function `main':
: undefined reference to `Iterateur<int>::operator++(int)'
test_list.o(.text+0x116): In function `main':
: undefined reference to `Liste<int>::inserer(Iterateur<int> const&, int const&)'
test_list.o(.text+0x128): In function `main':
: undefined reference to `Liste<int>::debut() const'
test_list.o(.text+0x14a): In function `main':
: undefined reference to `Iterateur<int>::operator++(int)'
test_list.o(.text+0x15c): In function `main':
: undefined reference to `Liste<int>::supprimer(Iterateur<int>&)'
test_list.o(.text+0x16e): In function `main':
: undefined reference to `Liste<int>::debut() const'
test_list.o(.text+0x18f): In function `main':
: undefined reference to `Liste<int>::fin() const'
test_list.o(.text+0x1a4): In function `main':
: undefined reference to `Iterateur<int>::operator!=(Iterateur<int> const&) const'
test_list.o(.text+0x1b5): In function `main':
: undefined reference to `Iterateur<int>::operator*() const'
test_list.o(.text+0x1e2): In function `main':
: undefined reference to `Iterateur<int>::operator++()'
test_list.o(.text+0x1f2): In function `main':
: undefined reference to `Liste<int>::Liste[in-charge]()'
test_list.o(.text+0x207): In function `main':
: undefined reference to `Liste<int>::operator=(Liste<int> const&)'
test_list.o(.text+0x243): In function `main':
: undefined reference to `Liste<int>::debut() const'
test_list.o(.text+0x270): In function `main':
: undefined reference to `Liste<int>::fin() const'
test_list.o(.text+0x288): In function `main':
: undefined reference to `Iterateur<int>::operator!=(Iterateur<int> const&) const'
test_list.o(.text+0x299): In function `main':
: undefined reference to `Iterateur<int>::operator*() const'
test_list.o(.text+0x2c6): In function `main':
: undefined reference to `Iterateur<int>::operator++()'
test_list.o(.text+0x2d6): In function `main':
: undefined reference to `Liste<int>::~Liste [in-charge]()'
test_list.o(.text+0x2e1): In function `main':
: undefined reference to `Liste<int>::~Liste [in-charge]()'
test_list.o(.text+0x2ec): In function `main':
: undefined reference to `Liste<int>::~Liste [in-charge]()'
test_list.o(.text+0x312): In function `main':
: undefined reference to `Liste<int>::~Liste [in-charge]()'
test_list.o(.text+0x331): In function `main':
: undefined reference to `Liste<int>::~Liste [in-charge]()'
test_list.o(.text+0x350): more undefined references to `Liste<int>::~Liste [in-charge]()' follow
collect2: ld a retourné 1 code d'état d'exécution
make: *** [liste] Erreur 1
Répondre à guian

4


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le lundi 6 novembre 2006 à 08:40:07
Salut.
Je n'ai pas tout regarder en détail, mais il me semble voir l'erreur.
Les templates ne sont pas des fonctions habituel.
Essai de tout mettre dans le .h, ça devrai fonctionner.
à prendre sous réserve : lorsque tu compile un template, la vrai fonction typer (avec int ou double à la place de T) n'est creer que quand elle est appeler dans le code, donc dans ton liste.cc tu ne fait apel à aucune fonction, donc elle n'est pas creer. et test.c ne voi pas la definition du constructeur qui est dans liste.cc Salutation !
Char Snipeur
Répondre à Char Snipeur

5


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
guian, le mercredi 8 novembre 2006 à 10:21:30
en effet, test_list ne voyai pas la definition du constructeur ...

j'ai essayer de mettre le code comme tu disai dans le .h mai il y avai alors interaction entre les différente instance de Element et il y avai des erreur due a une definition multiple etc ...

j'ai essayer de metre include"liste.cc" dans le .h ce qui a donné le meme resultat, et au final la soluytion ça a été de rajouter
#include"liste.cc" dans le test_list.cc ;) et hop ça roule !

merci bybye!
Répondre à guian

6


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le mercredi 8 novembre 2006 à 11:02:10
En fait, ce qu'il faut faire c mettre liste.cc dans le .h et supprimer liste.cc Salutation !
Char Snipeur
Répondre à Char Snipeur

7


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
FabHacker, le vendredi 16 mars 2007 à 22:35:03
Bonjour,

Désolé de faire remonter ce topic mais je suis tombé dessus par une recherche Google car j'ai EXACTEMENT le même problème. J'ai crée un class Liste pour faire une liste chainée, temporairement une liste de caractère.

J'ai voulu l'étendre à une liste d'éléments quelconque avec les templates. Seulement, je me suis rendu compte que une fois toutes les modifications faites, il y a une erreur à la compile:

"undefined references to `Liste<int>::Liste(void)`"

Dans le main.cpp, j'inclus juste le fichier liste.h
Et je me suis rendu compte que si j'inclus la source, liste.cpp, alors l'erreur disparait et la liste fonctionne correctement. Plus haut dans ce topic, il est dit de tout mettre dans le .h (ce qui devrait fonctionner) mais cependant je voudrais savoir s'il n'est pas possible de conserver la séparation entre implémentation et spécification, en clair toujours séparer le .h et le code source.

Merci de votre aide !
Répondre à FabHacker

8


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
Char Snipeur, le lundi 19 mars 2007 à 08:49:33
Salut.
Non, c'est impossible. Les template doivent être entièrement dans un .h !
un template est valable pour n'importe quel type, intégré ou non. C'est à dire que tu peux utilisé les template avec des class.
Comment un compilateur pourrai deviner quel class sera utilisé avnt même qu'elle soit créer ? C'est pour cela qu'il est impossible de compiler des templates en dehors d'un lien avec un fichier cpp qui appel ses fonctions Salutation !
Char Snipeur
Répondre à Char Snipeur

9


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
FabHacker, le jeudi 22 mars 2007 à 17:00:35
Ok merci beaucoup pour ces présisions, je ne vais pas chercher plus loin !
++
Répondre à FabHacker

11


  • Ce message vous semble utile, votez !
  • Signaler ce message aux modérateurs
 ekeyno, le lundi 21 juillet 2008 à 15:25:12
je crois que tu peux quand meme separer le truc c'est d'inclure le .ccp a la fin du .hh. Ca revient a tout mettre dans le header mais c'est plus propre ainsi.

ekeyno
Répondre à ekeyno

Résultats pour [c++ template]undefine reference to ...

Variable STATIC en C++ (Résolu) Bonjour, Je crée une class en C++ et il renvoie 'undefined reference to personne::nombre' Comment définir la variable static nombre dans sa class. Je ne veux pas définir nombre comme variable globale class personne { int code; // Privé char... www.commentcamarche.net/forum/affich-3675196-variable-static-en-c
[C/C++]problème avec GLUT (Résolu) Boujour, j'ai un porblème avec mon porjet C, je programme avec Dev-C++, je débute avec OpenGL, GLU et GLUT et j'ai un problème de Linker... Voilà quelques messages d'erreurs: [Linker error] undefined reference to `glutInit@8'... www.commentcamarche.net/forum/affich-2587310-c-c-probleme-avec-glut
Problème linker avec Dev C++ (Résolu) Bonjour à tous, je viens d'installer Dev C++ et impossible de compiler la moindre application. J'ai à chaque fois la même erreur : la compilation se passe bien, mais j'obtiens une "linker error" : [Linker error] undefined reference to... www.commentcamarche.net/forum/affich-4014250-probleme-linker-avec-dev-c

Résultats pour [c++ template]undefine reference to ...

Supprimer sans passer par la corbeillePar défaut, quand vous effacez un fichier avec Nautilus (l'explorateur de fichiers d'Ubuntu), les fichiers sont déplacés dans la corbeille. Ce n'est pas toujours souhaitable, surtout pour les gros fichiers. Voici comment faire pour effacer... www.commentcamarche.net/faq/sujet-8039-supprimer-sans-passer-par-la-corbeille
ICal - Synchronisation des anniversaires avec AddressBookComment ajouter les anniversaires de vos contacts dans iCal sans les saisir un à un ? Il parrait anormal que les dates d'anniversaires renseignées dans AddressBook ne se synchronisent pas automatiquement avec iCal. En réalité, ce n'est pas tout à... www.commentcamarche.net/faq/sujet-8381-ical-synchronisation-des-anniversaires-avec-addressbook

Résultats pour [c++ template]undefine reference to ...

C probleme de compilation (Résolu)Bonjour, sous mon ubuntu 7.10 avec la commande cc mon programme ne se compile pas et le terminal m'affiche " /tmp/ccVH6BUA.o: In function `visu_frame': Docu5.c:(.text+0x789): undefined reference to `cos' Docu5.c:(.text+0x7bf): undefined... www.commentcamarche.net/forum/affich-7159416-c-probleme-de-compilation
Librairie temps (Résolu)Salut, bon alors j ai un petit probleme de compil. Le truc c que je voudrait utiliser des fonction de temps en particulier clock_gettime. A la compilation gcc me dit "undefined reference to 'clock_gettime'" alors bon je sais que c un... www.commentcamarche.net/forum/affich-1462272-librairie-temps
[C] textcolor ne fonctionne pas (Résolu)salut, je programme sous dev-c++. en incluant la librairie conio.h et en utilisant "textcolor(2);"(par exemple), le programme ne compile pas ==> [Linker error] undefined reference to `textcolor' que faire? www.commentcamarche.net/forum/affich-3198559-c-textcolor-ne-fonctionne-pas

Résultats pour [c++ template]undefine reference to ...

Télécharger Modèle de Calendrier Mensuel ExcelModèle de Calendrier Mensuel Excel ou "Free Monthly Calendar Template" est un modèle qui peut s’ouvrir avec Microsoft Excel XP et les versions plus récentes. Il vous permet d’avoir un calendrier sur Excel pendant toute l’année, et même pour les années... www.commentcamarche.net/telecharger/telecharger-34056750-modele-de-calendrier-mensuel-excel
Télécharger Correctif Explorer Généralement lorsque "explorer.exe" plante sur votre ordinateur, vous perdez toutes les applications et bien sur le travail effectué. Ces applications sont encore en cours d'exécution mais non accessibles. Correctif explorer référence toutes vos... www.commentcamarche.net/telecharger/telecharger-34056043-correctif-explorer

Résultats pour [c++ template]undefine reference to ...

Zelda classé meilleur jeu de tous les temps selon un magazine britannique(Paris - Relaxnews) - Edge, l'intransigeant magazine de jeu vidéo britannique, livre dans un supplément en vente le 3 juillet en Angleterre un classement des cent meilleurs titres de tous les temps. Selon lui, le jeu Zelda : Ocarina of Times arrive en... www.commentcamarche.net/actualites/zelda-classe-meilleur-jeu-de-tous-les-temps-selon-un-magazine-britannique-3202421-actualite.php3
IPod Touch : à la découverte du baladeur sans bouton(Paris - Relaxnews) - Les technophiles mélomanes en ont rêvé, Steve Jobs l'a fait. Le patron d'Apple a dévoilé hier à San Francisco, une version entièrement tactile de son célèbre baladeur, l'iPod Touch. Découverte du nouveau gadget à la pomme.A... www.commentcamarche.net/actualites/ipod-touch-a-la-decouverte-du-baladeur-sans-bouton-3535898-actualite.php3
Noël : le top des produits les moins chers les plus recherchés sur la Toile(Paris - Relax news) - Les internautes aux petits budgets font des recherches de cadeaux bien particulières pour Noël. Produits déco, objets high-tech à petits prix et produits, Leguide.com a établi le top des produits à moins de 20 et moins de 50... www.commentcamarche.net/actualites/noel-le-top-des-produits-les-moins-chers-les-plus-recherches-sur-la-toile-4241568-actualite.php3

Résultats pour [c++ template]undefine reference to ...

RéférencementQu'est-ce que le référencement ? On désigne habituellement par le terme « référencement » (en anglais web positionning) l'ensemble des techniques permettant d'améliorer la visibilité d'un site web : indexation (en anglais submission) consistant à... www.commentcamarche.net/contents/web/referencement.php3