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

[g++] Spécialisation de template et erreur au link

1 réponse
Avatar
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) :

a.hpp (d=E9clarations)
=3D=3D=3D=3D=3D

template <typename TYPE>
struct A
{
void f() { /* ... */ }

TYPE v;
};

template <> void A <int>::f();

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) ?

Merci d'avance pour vos r=E9ponses.

Vincent

1 réponse

Avatar
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) :

a.hpp (déclarations)
==== >
template <typename TYPE>
struct A
{
void f() { /* ... */ }

TYPE v;
};

template <> void A <int>::f();

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