J'ai un petit souci avec un template qui pourtant d'après les exemples
et les tutoriels que j'ai consultés devrait se linker correctemment.
Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv)
{
CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0;
}
Le fichier en-tête :
#ifndef _cmatrice_h
#define _cmatrice_h
template <typename T>
class CMatrice
{
public:
CMatrice(long taille);
~CMatrice();
T getMatrice(long pos1, long pos2);
void setMatrice(long pos1, long pos2, T valeur);
long getN();
private:
T** matrice; // matrice carree N*N de type patron "T"
long N; // taille du cote de la matrice
};
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y
fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test"
/tmp/ccjrBb40.o(.text+0x1b): In function `main':
/home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to
`CMatrice<bool>::CMatrice[in-charge](long)'
/tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7:
undefined reference to `CMatrice<bool>::getMatrice(long, long)'
/tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
/tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je
rencontre?
Cette action est irreversible, confirmez la suppression du commentaire ?
Signaler le commentaire
Veuillez sélectionner un problème
Nudité
Violence
Harcèlement
Fraude
Vente illégale
Discours haineux
Terrorisme
Autre
Christophe Lephay
"Djédjé" a écrit dans le message de news:
J'ai un petit souci avec un template qui pourtant d'après les exemples et les tutoriels que j'ai consultés devrait se linker correctemment. Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv) { CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0; }
Le fichier en-tête :
#ifndef _cmatrice_h #define _cmatrice_h
template <typename T> class CMatrice { public: CMatrice(long taille); ~CMatrice(); T getMatrice(long pos1, long pos2); void setMatrice(long pos1, long pos2, T valeur);
long getN();
private: T** matrice; // matrice carree N*N de type patron "T" long N; // taille du cote de la matrice };
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test" /tmp/ccjrBb40.o(.text+0x1b): In function `main': /home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to `CMatrice<bool>::CMatrice[in-charge](long)' /tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7: undefined reference to `CMatrice<bool>::getMatrice(long, long)' /tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' /tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je rencontre?
Il faut inclure le fichier contenant les définitions de tes templates (cmatrice.c ou .cc ou .cpp)
Chris
"Djédjé" <oxy@isuisse.com> a écrit dans le message de
news:392de28a.0306271308.5e459731@posting.google.com...
J'ai un petit souci avec un template qui pourtant d'après les exemples
et les tutoriels que j'ai consultés devrait se linker correctemment.
Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv)
{
CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0;
}
Le fichier en-tête :
#ifndef _cmatrice_h
#define _cmatrice_h
template <typename T>
class CMatrice
{
public:
CMatrice(long taille);
~CMatrice();
T getMatrice(long pos1, long pos2);
void setMatrice(long pos1, long pos2, T valeur);
long getN();
private:
T** matrice; // matrice carree N*N de type patron "T"
long N; // taille du cote de la matrice
};
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y
fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test"
/tmp/ccjrBb40.o(.text+0x1b): In function `main':
/home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to
`CMatrice<bool>::CMatrice[in-charge](long)'
/tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7:
undefined reference to `CMatrice<bool>::getMatrice(long, long)'
/tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
/tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je
rencontre?
Il faut inclure le fichier contenant les définitions de tes templates
(cmatrice.c ou .cc ou .cpp)
J'ai un petit souci avec un template qui pourtant d'après les exemples et les tutoriels que j'ai consultés devrait se linker correctemment. Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv) { CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0; }
Le fichier en-tête :
#ifndef _cmatrice_h #define _cmatrice_h
template <typename T> class CMatrice { public: CMatrice(long taille); ~CMatrice(); T getMatrice(long pos1, long pos2); void setMatrice(long pos1, long pos2, T valeur);
long getN();
private: T** matrice; // matrice carree N*N de type patron "T" long N; // taille du cote de la matrice };
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test" /tmp/ccjrBb40.o(.text+0x1b): In function `main': /home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to `CMatrice<bool>::CMatrice[in-charge](long)' /tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7: undefined reference to `CMatrice<bool>::getMatrice(long, long)' /tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' /tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je rencontre?
Il faut inclure le fichier contenant les définitions de tes templates (cmatrice.c ou .cc ou .cpp)
Chris
oxy
"Christophe Lephay" wrote in message news:<bdifq0$qmq$...
"Djédjé" a écrit dans le message de news:
J'ai un petit souci avec un template qui pourtant d'après les exemples et les tutoriels que j'ai consultés devrait se linker correctemment. Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv) { CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0; }
Le fichier en-tête :
#ifndef _cmatrice_h #define _cmatrice_h
template <typename T> class CMatrice { public: CMatrice(long taille); ~CMatrice(); T getMatrice(long pos1, long pos2); void setMatrice(long pos1, long pos2, T valeur);
long getN();
private: T** matrice; // matrice carree N*N de type patron "T" long N; // taille du cote de la matrice };
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test" /tmp/ccjrBb40.o(.text+0x1b): In function `main': /home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to `CMatrice<bool>::CMatrice[in-charge](long)' /tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7: undefined reference to `CMatrice<bool>::getMatrice(long, long)' /tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' /tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je rencontre?
Il faut inclure le fichier contenant les définitions de tes templates (cmatrice.c ou .cc ou .cpp)
Chris
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas surcharger trop mon post. Le CMatrice.cpp est le suivant :
#include "../include/CMatrice.h"
template <typename T> CMatrice<T>::CMatrice(long taille) { long i = 0; N = taille;
matrice = new T*[N]; for (i = 0; i < N; i++) matrice[i] = new T[N]; } template <typename T> CMatrice<T>::~CMatrice() { for(long i=0; i<N; i++ ) delete []matrice[i]; delete []matrice; } template <typename T> T CMatrice<T>::getMatrice(long pos1, long pos2) { try{return matrice[pos1][pos2];} catch(...){printf("indice de matrice (%ld ou %ld) invaliden",pos1,pos2);} }
template <typename T> void CMatrice<T>::setMatrice(long pos1, long pos2, T valeur) { try{matrice[pos1][pos2]= valeur;} catch(...){printf("indice de matrice (%ld ou %ld) invaliden",pos1,pos2);} }
template <typename T> long CMatrice<T>::getN(){return N;}
Là tout est défini, ça passe à la compil, mais à l'édition de lien il n'est pas content du tout...
"Christophe Lephay" <christophe-lephay@wanadoo.fr> wrote in message news:<bdifq0$qmq$1@news-reader3.wanadoo.fr>...
"Djédjé" <oxy@isuisse.com> a écrit dans le message de
news:392de28a.0306271308.5e459731@posting.google.com...
J'ai un petit souci avec un template qui pourtant d'après les exemples
et les tutoriels que j'ai consultés devrait se linker correctemment.
Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv)
{
CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0;
}
Le fichier en-tête :
#ifndef _cmatrice_h
#define _cmatrice_h
template <typename T>
class CMatrice
{
public:
CMatrice(long taille);
~CMatrice();
T getMatrice(long pos1, long pos2);
void setMatrice(long pos1, long pos2, T valeur);
long getN();
private:
T** matrice; // matrice carree N*N de type patron "T"
long N; // taille du cote de la matrice
};
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y
fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test"
/tmp/ccjrBb40.o(.text+0x1b): In function `main':
/home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to
`CMatrice<bool>::CMatrice[in-charge](long)'
/tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7:
undefined reference to `CMatrice<bool>::getMatrice(long, long)'
/tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
/tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9:
undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()'
collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je
rencontre?
Il faut inclure le fichier contenant les définitions de tes templates
(cmatrice.c ou .cc ou .cpp)
Chris
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas
surcharger trop mon post. Le CMatrice.cpp est le suivant :
#include "../include/CMatrice.h"
template <typename T>
CMatrice<T>::CMatrice(long taille)
{
long i = 0;
N = taille;
matrice = new T*[N];
for (i = 0; i < N; i++) matrice[i] = new T[N];
}
template <typename T>
CMatrice<T>::~CMatrice()
{
for(long i=0; i<N; i++ )
delete []matrice[i];
delete []matrice;
}
template <typename T>
T CMatrice<T>::getMatrice(long pos1, long pos2)
{
try{return matrice[pos1][pos2];}
catch(...){printf("indice de matrice (%ld ou %ld)
invaliden",pos1,pos2);}
}
template <typename T>
void CMatrice<T>::setMatrice(long pos1, long pos2, T valeur)
{
try{matrice[pos1][pos2]= valeur;}
catch(...){printf("indice de matrice (%ld ou %ld)
invaliden",pos1,pos2);}
}
template <typename T>
long CMatrice<T>::getN(){return N;}
Là tout est défini, ça passe à la compil, mais à l'édition de lien il
n'est pas content du tout...
"Christophe Lephay" wrote in message news:<bdifq0$qmq$...
"Djédjé" a écrit dans le message de news:
J'ai un petit souci avec un template qui pourtant d'après les exemples et les tutoriels que j'ai consultés devrait se linker correctemment. Voici le problème réduit à un tout petit exemple :
le programme principal :
#include "../include/CMatrice.h"
int main(int argc, char** argv) { CMatrice<bool> matrice(10);
matrice.getMatrice(1,1);
return 0; }
Le fichier en-tête :
#ifndef _cmatrice_h #define _cmatrice_h
template <typename T> class CMatrice { public: CMatrice(long taille); ~CMatrice(); T getMatrice(long pos1, long pos2); void setMatrice(long pos1, long pos2, T valeur);
long getN();
private: T** matrice; // matrice carree N*N de type patron "T" long N; // taille du cote de la matrice };
#endif
J'ai essayé avec le mot-clef class à la place de typename, mais rien y fait, j'ai toujours l'erreur suivante :
$ g++ -Wall -g "test.cpp" -o "test" /tmp/ccjrBb40.o(.text+0x1b): In function `main': /home/prog-x/Projects/essai/src/test.cpp:5: undefined reference to `CMatrice<bool>::CMatrice[in-charge](long)' /tmp/ccjrBb40.o(.text+0x2e):/home/prog-x/Projects/essai/src/test.cpp:7: undefined reference to `CMatrice<bool>::getMatrice(long, long)' /tmp/ccjrBb40.o(.text+0x3d):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' /tmp/ccjrBb40.o(.text+0x54):/home/prog-x/Projects/essai/src/test.cpp:9: undefined reference to `CMatrice<bool>::~CMatrice [in-charge]()' collect2: ld returned 1 exit status
Quelqu'un à une idée de la source et/ou du genre de problème que je rencontre?
Il faut inclure le fichier contenant les définitions de tes templates (cmatrice.c ou .cc ou .cpp)
Chris
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas surcharger trop mon post. Le CMatrice.cpp est le suivant :
#include "../include/CMatrice.h"
template <typename T> CMatrice<T>::CMatrice(long taille) { long i = 0; N = taille;
matrice = new T*[N]; for (i = 0; i < N; i++) matrice[i] = new T[N]; } template <typename T> CMatrice<T>::~CMatrice() { for(long i=0; i<N; i++ ) delete []matrice[i]; delete []matrice; } template <typename T> T CMatrice<T>::getMatrice(long pos1, long pos2) { try{return matrice[pos1][pos2];} catch(...){printf("indice de matrice (%ld ou %ld) invaliden",pos1,pos2);} }
template <typename T> void CMatrice<T>::setMatrice(long pos1, long pos2, T valeur) { try{matrice[pos1][pos2]= valeur;} catch(...){printf("indice de matrice (%ld ou %ld) invaliden",pos1,pos2);} }
template <typename T> long CMatrice<T>::getN(){return N;}
Là tout est défini, ça passe à la compil, mais à l'édition de lien il n'est pas content du tout...
Vincent Lascaux
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas surcharger trop mon post. Le CMatrice.cpp est le suivant :
Comme pour les fonctions inline, il ne doit pas y avoir une unité de compilation séparée pour les templates. Il ne faut pas que tu compiles ton CMatrice.cpp, et il faut que tu ajoutes à la fin de ton header un #include "CMatric.cpp"
La convention est souvent de renomer CMatrice.cpp en CMatrice.inl
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas
surcharger trop mon post. Le CMatrice.cpp est le suivant :
Comme pour les fonctions inline, il ne doit pas y avoir une unité de
compilation séparée pour les templates. Il ne faut pas que tu compiles ton
CMatrice.cpp, et il faut que tu ajoutes à la fin de ton header un
#include "CMatric.cpp"
La convention est souvent de renomer CMatrice.cpp en CMatrice.inl
Oui je l'avais mis, je ne l'ai simplement pas rajouté ici pour ne pas surcharger trop mon post. Le CMatrice.cpp est le suivant :
Comme pour les fonctions inline, il ne doit pas y avoir une unité de compilation séparée pour les templates. Il ne faut pas que tu compiles ton CMatrice.cpp, et il faut que tu ajoutes à la fin de ton header un #include "CMatric.cpp"
La convention est souvent de renomer CMatrice.cpp en CMatrice.inl
Michaël Monerau
Djédjé wrote:
void setMatrice(long pos1, long pos2, T valeur);
Au passage, préfère :
void setMatrice(long pos1, long pos2, const T& valeur);
Ca permet de ne pas copier l'objet valeur. Si T est un type pour lequel la copie coûte cher en temps ou en resources, c'est préférable :) -- <-= Michaël "Cortex" Monerau =->
Djédjé wrote:
void setMatrice(long pos1, long pos2, T valeur);
Au passage, préfère :
void setMatrice(long pos1, long pos2, const T& valeur);
Ca permet de ne pas copier l'objet valeur. Si T est un type pour lequel la
copie coûte cher en temps ou en resources, c'est préférable :)
--
<-= Michaël "Cortex" Monerau =->
void setMatrice(long pos1, long pos2, const T& valeur);
Ca permet de ne pas copier l'objet valeur. Si T est un type pour lequel la copie coûte cher en temps ou en resources, c'est préférable :) -- <-= Michaël "Cortex" Monerau =->