OVH Cloud OVH Cloud

Spécialisation d'une fonction de classe template

2 réponses
Avatar
Charles Brossollet
Bonjour,

J'essaie de sp=E9cialiser une fonction template membre d'une classe
template, mais j'arrive pas =E0 trouver la syntaxe. Quand je sp=E9cialise
inline, vc++ compile, mais pas comeau online. Quand je sp=E9cialise en
dehors de la classe (ce qui est ce que je veux), les 2 compilos me
jettent.

Mon code:

template <class T> struct A
{
template <class U>
U f(U arg){return arg;}

//sp=E9cialisation inline: vc++7.1 passe, mais pas comeau
template<>
double f(double arg){return arg+2.;}
};

template <class T> struct B
{
template <class U>
U f(U arg){return arg;}
};

//sp=E9cialisation "offline" : ni vc++ ni comeau ne compile
template <class T> template<>
double B<T>::f(double arg){return arg+2.;}

int main()
{
A<int> a; a.f(2); a.f(2.);
B<int> b; b.f(2); b.f(2.);
return 0;
}


Merci d'avance

2 réponses

Avatar
Loïc Joly
Charles Brossollet wrote:
Bonjour,

J'essaie de spécialiser une fonction template membre d'une classe
template, mais j'arrive pas à trouver la syntaxe. Quand je spécialise
inline, vc++ compile, mais pas comeau online. Quand je spécialise en
dehors de la classe (ce qui est ce que je veux), les 2 compilos me
jettent.

Mon code:

template <class T> struct A
{
template <class U>
U f(U arg){return arg;}

//spécialisation inline: vc++7.1 passe, mais pas comeau
template<>
double f(double arg){return arg+2.;}
};

template <class T> struct B
{
template <class U>
U f(U arg){return arg;}
};

//spécialisation "offline" : ni vc++ ni comeau ne compile
template <class T> template<>
double B<T>::f(double arg){return arg+2.;}

int main()
{
A<int> a; a.f(2); a.f(2.);
B<int> b; b.f(2); b.f(2.);
return 0;
}


Merci d'avance



Dans "C++ templates" de Vandevoorde et Jossutis, on peut lire p197-199 :

template<typename T>
class Outer {
public:
template<typename U>
class Inner {
[...]
};
[...]
};

[...]

The template Outer<T>::Inner can also be specialized, but only for a
given instance of Outer<T>.
[...]

// template<> cannot follow a template parameter list
template<typename X>
template<> class Outer<X>::Inner<void>; // ERROR!


Donc, bien qu'ils n'expliquent pas vraiment les raisons, ils semblent
dire que ce que tu souhaites faire est impossible. Ne peux tu pas faire
de f une fonction libre et utiliser la spécialisation partielle ?

--
Loïc

Avatar
drkm
Loïc Joly writes:

Charles Brossollet wrote:


[...]

template <class T> struct A
{
template <class U>
U f(U arg){return arg;}
//spécialisation inline: vc++7.1 passe, mais pas comeau
template<>
double f(double arg){return arg+2.;}
};



[...]

Dans "C++ templates" de Vandevoorde et Jossutis, on peut lire p197-199 :

template<typename T>
class Outer {
public:
template<typename U>
class Inner {
[...]
};
[...]
};

[...]

The template Outer<T>::Inner can also be specialized, but only for a
given instance of Outer<T>.
[...]

// template<> cannot follow a template parameter list
template<typename X>
template<> class Outer<X>::Inner<void>; // ERROR!

Donc, bien qu'ils n'expliquent pas vraiment les raisons, ils semblent
dire que ce que tu souhaites faire est impossible. Ne peux tu pas
faire de f une fonction libre et utiliser la spécialisation partielle ?


Je n'ai jamais vraiment compris les subtilités des instantiations de
modèles, le point d'instantiation, etc. Ne pourrait-on dire, dans son
exemple de A<>, que la spécialisation de A<>::f<>() ne serait vue [*]
qu'à l'instantiation de A<> ?

[*] Je manque même de vocabulaire dans ce domaine. Mais il me
semble qu'il y a un certain nombre de choses qui sont laissées
en suspend par le compilo lors de l'analyse syntaxique d'un
modèle, choses sur lesquelles il revient lors de
l'instantiation. Mais je serais incapable de donner un
exemple. Ni même si cela est exact.

--drkm, en recherche d'un stage : http://www.fgeorges.org/ipl/stage.html