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

Spécialisation d'une méthode template membre d'une classe template

4 réponses
Avatar
Pierre BRÉAU
Bonjour

Soit une classe template A avec une méthode template membre f :

template<typename T>struct A {
template<typename S>void f(S const &s);
};

Dans mes définitions, je veux spécialiser la méthode mais pas la classe.
Je pense à quelque chose du type :

template<typename T>template<>void A<T>::f(int const &s)
{
}

mais c'est ambigu... et les compilateurs que j'ai essayé le refusent
logiquement.

Cette opération est-elle possible ? Dans ce cas, comment dois-je l'écrire ?

Merci de votre aide.

Pierre BRÉAU

4 réponses

Avatar
Sylvain
Pierre BRÉAU wrote on 09/02/2007 01:19:
Bonjour

Soit une classe template A avec une méthode template membre f :

template<typename T>struct A {
template<typename S>void f(S const &s);
};

Dans mes définitions, je veux spécialiser la méthode mais pas la classe.
Je pense à quelque chose du type : [...]


spécialiser une définition de template n'a pas de sens - ou j'ai loupé
une épisode, ou "spécialiser" a changé de sens - vous ne pouvez que
spécialiser une méthode d'une classe concrète, donc d'une "instantiation
de template"; pas sur de comprendre non plus le sens du paramètre
template S de la fonction f() ...

Sylvain.

Avatar
Sylvain
Sylvain wrote on 08/02/2007 01:37:

pas sur de comprendre non plus le sens du paramètre
template S de la fonction f() ...


ne pas considérer ce point, je n'avais lu que les params de la seconde
définition de f(), "int const s&" ...

la solution est peut être simplement d'imposer (par contrat) une classe
(polymorphe) comme paramètre template 'S' dans votre première expression.

Sylvain.

Avatar
Etienne
Cette opération est-elle possible ?


non

Le seul cas qui est possible est que ta méthode soit complement
spécialisée:

template<>template<>void A<Pouet>::f(int const &s)
{

}

Etienne

Avatar
Franck Branjonneau
Pierre BRÉAU écrivait:

Soit une classe template A avec une méthode template membre f :

template<typename T>struct A {
template<typename S>void f(S const &s);
};

Dans mes définitions, je veux spécialiser la méthode mais pas la
classe. Je pense à quelque chose du type :

template<typename T>template<>void A<T>::f(int const &s)
{
}

mais c'est ambigu... et les compilateurs que j'ai essayé le refusent
logiquement.

Cette opération est-elle possible ?


Non, comme le dit Etienne, tu dois spécialiser de l'extérieur vers
l'intérieur.

Dans ce cas, comment dois-je l'écrire ?


template< typename T, typename S >
struct F {

void
operator()(
S const & s);
};


template< typename T >
struct A {

template< typename S >
inline void
f(
S const & s) {

F< T, S >()(s);
}
};

template<> // Optionnel
template< typename T >
struct F< T, int > {

void
operator()(int const & s) {

std::cout << s << "n";
}
};

int main() {

A< double > a;
a.f(5);
}

par exemple.

--
Franck Branjonneau