OVH Cloud OVH Cloud

Problème spécialisation de template GCC

8 réponses
Avatar
diego-olivier.fernandez-pons
Bonjour,

Je n'arrive pas avec GCC =E0 compiler des sp=E9cialisation de template
avec des fonctions d=E9clar=E9es en dehors du prototype (mais dans le
m=EAme fichier), alors qu'avec les fonctions d=E9velopp=E9es in-line, tout
semble marcher. Voil=E0 un code (trouv=E9 sur le web) qui ne compile pas
sous GCC 3.4.1

i) Quelqu'un a une explication ?
ii) Existe t-il une fa=E7on de contourner le probl=E8me ?

Diego Olivier

template <class T> class pair {
T value1, value2;
public:
pair (T first, T second)
{value1=3Dfirst; value2=3Dsecond;}
T module () {return 0;}
};

template <> class pair <int> {
int value1, value2;
public:
pair (int first, int second)
{value1=3Dfirst; value2=3Dsecond;}
int module ();
};

template <> int pair<int>::module() {
return value1%value2;
}


int main(int argc, char** argv) {

return 0;

}

dofpons@mymachine ~/code/test $ make
/usr/bin/g++ -c -g -Wall -I/nfs/home/dofpons/code/test
-I/nfs/home/dofpons/code/test
/nfs/home/dofpons/code/test/test.cpp -o /usr/progs/test/test.o
/nfs/home/dofpons/code/test/test.cpp:22: error: template-id `module<>'
for
`int pair<int>::module()' does not match any template declaration
/nfs/home/dofpons/code/test/test.cpp:22: error: invalid function
declaration
make: *** [/usr/progs/test/test.o] Erreur 1

8 réponses

Avatar
Stan
a écrit dans le message de
news:
Bonjour,

Je n'arrive pas avec GCC à compiler des spécialisation de template
avec des fonctions déclarées en dehors du prototype (mais dans le
même fichier), alors qu'avec les fonctions développées in-line, tout
semble marcher. Voilà un code (trouvé sur le web) qui ne compile pas
sous GCC 3.4.1


Que contient le make ?
As-tu essayé de faire : g++ test.cpp -o test
( si le source contenant le main s'appelle test ) ?
D'ailleurs, est-ce que l'exemple que tu as donné est bien dans le même
source ?

Car l'exemple compile très bien, même sur gcc 2.96.

--
-Stan

Avatar
Alain Cabiran
Bonjour,

je suis pas spécialiste du c++ mais ça serait pas plutôt :

template <class T> class pair {
protected:
T value1, value2;
public:
pair() { }; // juste au cas où ...
pair (T first, T second)
{value1=first; value2=second;}
T module () {return 0;}
};

class IntPair : public pair<int>
{
public:
int module();
};

int IntPair::module()
{
return value1 % value 2;
}

???

hope this helps,

Alain C.

Bonjour,

Je n'arrive pas avec GCC à compiler des spécialisation de template
avec des fonctions déclarées en dehors du prototype (mais dans le
même fichier), alors qu'avec les fonctions développées in-line, tout
semble marcher. Voilà un code (trouvé sur le web) qui ne compile pas
sous GCC 3.4.1

i) Quelqu'un a une explication ?
ii) Existe t-il une façon de contourner le problème ?

Diego Olivier

template <class T> class pair {
T value1, value2;
public:
pair (T first, T second)
{value1=first; value2=second;}
T module () {return 0;}
};

template <> class pair <int> {
int value1, value2;
public:
pair (int first, int second)
{value1=first; value2=second;}
int module ();
};

template <> int pair<int>::module() {
return value1%value2;
}


int main(int argc, char** argv) {

return 0;

}

~/code/test $ make
/usr/bin/g++ -c -g -Wall -I/nfs/home/dofpons/code/test
-I/nfs/home/dofpons/code/test
/nfs/home/dofpons/code/test/test.cpp -o /usr/progs/test/test.o
/nfs/home/dofpons/code/test/test.cpp:22: error: template-id `module<>'
for
`int pair<int>::module()' does not match any template declaration
/nfs/home/dofpons/code/test/test.cpp:22: error: invalid function
declaration
make: *** [/usr/progs/test/test.o] Erreur 1



Avatar
Stan
"Stan" a écrit dans le message de news:
434fdc3a$0$1730$

a écrit dans le message de
news:
Bonjour,

Je n'arrive pas avec GCC à compiler des spécialisation de template
avec des fonctions déclarées en dehors du prototype (mais dans le
même fichier), alors qu'avec les fonctions développées in-line, tout
semble marcher. Voilà un code (trouvé sur le web) qui ne compile pas
sous GCC 3.4.1


Que contient le make ?
As-tu essayé de faire : g++ test.cpp -o test
( si le source contenant le main s'appelle test ) ?
D'ailleurs, est-ce que l'exemple que tu as donné est bien dans le même
source ?

Car l'exemple compile très bien, même sur gcc 2.96.

--
-Stan



Cependant, la spécialisation contient la déclaration de module sans
être défini... ( int module( ) { return 0; } .


--
-Stan


Avatar
Jean-Marc Bourguet
writes:

template <> int pair<int>::module() {
return value1%value2;
}


int pair<int>::module() {
return value1%value2;
}

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org

Avatar
Stan
"Alain Cabiran" a écrit dans le message de
news: 434fdc5d$0$461$
Bonjour,

je suis pas spécialiste du c++ mais ça serait pas plutôt :

[...]


int IntPair::module()
{
return value1 % value 2;
}

???


Il y a là une belle confusion.
pair<> représente une paire de types ( un ensemble de 2 types ).
Il ne s'agit pas de la parité mathématique.

--
-Stan

Avatar
Stan
"Jean-Marc Bourguet" a écrit dans le message de news:

writes:

template <> int pair<int>::module() {
return value1%value2;
}


int pair<int>::module() {
return value1%value2;
}



Effectivement, j'avais compilé sans
la partie en cause...
Cruelle fin de semaine :-)

--
-Stan


Avatar
diego-olivier.fernandez-pons
Bonjour,

int pair<int>::module() {
return value1%value2;
}


Oui mais ce code que j'ai trouvé sur internet compile (d'après son
auteur) sous VC++ - que je n'ai pas sous la main mais sur lequel mon
code doit tourner. Je dois pouvoir m'en tirer avec des #define mais ça
ne m'emballe pas particulièrement.

Et je croyais que la norme exigeait "template <>"

Et ils commencent à me casser les pieds les compilateurs à ne par
respecter la norme.

Et puis Caml, au moins, contrairement à C++ ça marche partout pareil.


Diego Olivier

Avatar
Jean-Marc Bourguet
writes:

Bonjour,

int pair<int>::module() {
return value1%value2;
}


Oui mais ce code que j'ai trouvé sur internet compile (d'après son
auteur) sous VC++ - que je n'ai pas sous la main mais sur lequel mon
code doit tourner. Je dois pouvoir m'en tirer avec des #define mais ça
ne m'emballe pas particulièrement.

Et je croyais que la norme exigeait "template <>"


C'est l'inverse, la norme l'interdit.

A+

--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org