C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Spécialisation d'une fonction de classe template

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Charles Brossollet
Guest





PostPosted: Mon Aug 16, 2004 12:36 pm    Post subject: Spécialisation d'une fonction de classe template Reply with 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 <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





PostPosted: Mon Aug 16, 2004 1:14 pm    Post subject: Re: Spécialisation d'une fonction de classe template Reply with quote



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





PostPosted: Mon Aug 16, 2004 2:27 pm    Post subject: Re: Spécialisation d'une fonction de classe template Reply with quote



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





PostPosted: Mon Aug 16, 2004 9:46 pm    Post subject: Re: Spécialisationd'une fonction de classe template Reply with quote

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





PostPosted: Mon Aug 16, 2004 11:40 pm    Post subject: Re: Spécialisation d'une fonction de classe template Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.