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.;}
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
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.;}
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
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.;}
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 ?
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.;}
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
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
Loïc Joly <loic.actarus.joly@wanadoo.fr> 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
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