Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

template et typname

4 réponses
Avatar
oxy
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?

4 réponses

Avatar
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

Avatar
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...


Avatar
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

Avatar
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 =->