 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Charles Brossollet Guest
|
Posted: Mon Aug 16, 2004 12:36 pm Post subject: Spécialisation d'une fonction de classe template |
|
|
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
|
|
| Back to top |
|
 |
Loïc Joly Guest
|
Posted: Mon Aug 16, 2004 1:14 pm Post subject: Re: Spécialisation d'une fonction de classe template |
|
|
Charles Brossollet wrote:
| Quote: | 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
{
template <class U
U f(U arg){return arg;}
};
//spécialisation "offline" : ni vc++ ni comeau ne compile
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
|
|
| Back to top |
|
 |
Charles Brossollet Guest
|
Posted: Mon Aug 16, 2004 2:27 pm Post subject: Re: Spécialisation d'une fonction de classe template |
|
|
Loïc Joly wrote:
| Quote: | 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:
[snip]
Merci d'avance
Dans "C++ templates" de Vandevoorde et Jossutis, on peut lire
p197-199 :
template<typename T
class Outer {
public:
template
class Inner {
[...]
};
[...]
};
[...]
The template Outer
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 ?
|
Non, car la fonction en question c'est l'operateur d'assignation de ma
classe...
|
|
| Back to top |
|
 |
Charles Brossollet Guest
|
Posted: Mon Aug 16, 2004 9:46 pm Post subject: Re: Spécialisationd'une fonction de classe template |
|
|
Charles Brossollet <chbrosso (AT) free (DOT) fr> wrote:
| Quote: | Non, car la fonction en question c'est l'operateur d'assignation de ma
classe...
|
Bon, en fait j'ai trouvé : en faisant une surcharge plutôt qu'une
spécialisation ça marche
--
Charles
|
|
| Back to top |
|
 |
drkm Guest
|
Posted: Mon Aug 16, 2004 11:40 pm Post subject: Re: Spécialisation d'une fonction de classe template |
|
|
Loïc Joly <loic.actarus.joly (AT) wanadoo (DOT) fr> writes:
| Quote: | Charles Brossollet wrote:
|
[...]
| Quote: | 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.;}
};
|
[...]
| Quote: | Dans "C++ templates" de Vandevoorde et Jossutis, on peut lire p197-199 :
template
class Outer {
public:
template
class Inner {
[...]
};
[...]
};
[...]
The template Outer
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
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|