[g++] Spécialisation de template et erreur au link
1 réponse
Vincent Richard
Bonsoir,
J'ai un petit probl=E8me pour compiler et linker le code suivant avec
la version 3.2 de GNU g++. Cela fonctionne sans probl=E8me avec les
versions suivantes (3.3 et 3.4) :
a1.cpp (d=E9finition de f() pour le type 'int')
=3D=3D=3D=3D=3D=3D
#include "a.hpp"
template <> void A <int>::f()
{
// ...
}
a2.cpp (main)
=3D=3D=3D=3D=3D=3D
#include "a.hpp"
int main()
{
A <int> a;
a.f();
}
Je compile avec la commande suivante :
$ g++ -o prog a1.cpp a2.cpp
L'erreur obtenue est la suivante (au link) :
/tmp/ccFY1RVe.o(.text+0x18): In function `main':
: undefined reference to `A<int>::f()'
collect2: ld returned 1 exit status
Est-ce un bug ? (apparement oui, car =E7a fonctionne dans les versions
suivantes) Y'a-t-il une astuce pour contourner =E7a, autre que de
d=E9finir la fonction dans le .hpp (en inline) ?
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
Pierre Lairez
La syntaxe n'est pas
template <> void A <int>::f();
mais
template void A <int>::f();
Cependant, ton problème m'étonne, puisque A <int>::f() est déjà déclaré explicitement, il ne devrait pas y avoir besoin du prototype...
Le Mon, 3 Jan 2005 20:57:29 +0100, Vincent Richard a écrit:
Bonsoir,
J'ai un petit problème pour compiler et linker le code suivant avec la version 3.2 de GNU g++. Cela fonctionne sans problème avec les versions suivantes (3.3 et 3.4) :
a1.cpp (définition de f() pour le type 'int') ===== > #include "a.hpp"
template <> void A <int>::f() { // ... }
a2.cpp (main) ===== > #include "a.hpp"
int main() { A <int> a; a.f(); }
Je compile avec la commande suivante :
$ g++ -o prog a1.cpp a2.cpp
L'erreur obtenue est la suivante (au link) :
/tmp/ccFY1RVe.o(.text+0x18): In function `main': : undefined reference to `A<int>::f()' collect2: ld returned 1 exit status
Est-ce un bug ? (apparement oui, car ça fonctionne dans les versions suivantes) Y'a-t-il une astuce pour contourner ça, autre que de définir la fonction dans le .hpp (en inline) ?
Merci d'avance pour vos réponses.
Vincent
La syntaxe n'est pas
template <> void A <int>::f();
mais
template void A <int>::f();
Cependant, ton problème m'étonne, puisque A <int>::f() est déjà déclaré
explicitement, il ne devrait pas y avoir besoin du prototype...
Le Mon, 3 Jan 2005 20:57:29 +0100, Vincent Richard
<chere-loque@plop.wanadoo.fr.invalid> a écrit:
Bonsoir,
J'ai un petit problème pour compiler et linker le code suivant avec
la version 3.2 de GNU g++. Cela fonctionne sans problème avec les
versions suivantes (3.3 et 3.4) :
a1.cpp (définition de f() pour le type 'int')
===== >
#include "a.hpp"
template <> void A <int>::f()
{
// ...
}
a2.cpp (main)
===== >
#include "a.hpp"
int main()
{
A <int> a;
a.f();
}
Je compile avec la commande suivante :
$ g++ -o prog a1.cpp a2.cpp
L'erreur obtenue est la suivante (au link) :
/tmp/ccFY1RVe.o(.text+0x18): In function `main':
: undefined reference to `A<int>::f()'
collect2: ld returned 1 exit status
Est-ce un bug ? (apparement oui, car ça fonctionne dans les versions
suivantes) Y'a-t-il une astuce pour contourner ça, autre que de
définir la fonction dans le .hpp (en inline) ?
Cependant, ton problème m'étonne, puisque A <int>::f() est déjà déclaré explicitement, il ne devrait pas y avoir besoin du prototype...
Le Mon, 3 Jan 2005 20:57:29 +0100, Vincent Richard a écrit:
Bonsoir,
J'ai un petit problème pour compiler et linker le code suivant avec la version 3.2 de GNU g++. Cela fonctionne sans problème avec les versions suivantes (3.3 et 3.4) :
a1.cpp (définition de f() pour le type 'int') ===== > #include "a.hpp"
template <> void A <int>::f() { // ... }
a2.cpp (main) ===== > #include "a.hpp"
int main() { A <int> a; a.f(); }
Je compile avec la commande suivante :
$ g++ -o prog a1.cpp a2.cpp
L'erreur obtenue est la suivante (au link) :
/tmp/ccFY1RVe.o(.text+0x18): In function `main': : undefined reference to `A<int>::f()' collect2: ld returned 1 exit status
Est-ce un bug ? (apparement oui, car ça fonctionne dans les versions suivantes) Y'a-t-il une astuce pour contourner ça, autre que de définir la fonction dans le .hpp (en inline) ?