explicite de la spécialisation du modèle de fonction membre de classe
J'ai besoin de spécialiser modèle de fonction de membre d'un certain type (disons double). Il fonctionne très bien tandis que la catégorie X
lui-même n'est pas un modèle de classe, mais lorsque je fais de modèle GCC commence à donner des erreurs de compilation.
#include <iostream>
#include <cmath>
template <class C> class X
{
public:
template <class T> void get_as();
};
template <class C>
void X<C>::get_as<double>()
{
}
int main()
{
X<int> x;
x.get_as();
}
voici le message d'erreur
source.cpp:11:27: error: template-id
'get_as<double>' in declaration of primary template
source.cpp:11:6: error: prototype for
'void X<C>::get_as()' does not match any in class 'X<C>'
source.cpp:7:35: error: candidate is:
template<class C> template<class T> void X::get_as()
Comment puis-je régler ce problème et quel est le problème ici?
Merci d'avance.
- ce qui est illégal dans la norme actuelle, à se spécialiser, vous devez vous spécialiser la classe ainsi...
- mais cela fonctionne si la classe n'est pas un modèle. Est-il illégal trop?
- non, c'est parfaitement bien, c'est uniquement pour les modèles de classe que cette règle s'applique (autant que je sache).
Vous devez vous connecter pour publier un commentaire.
Il ne fonctionne pas de cette façon. Vous auriez besoin de dire ce qui suit, mais il est pas corriger
Explicitement spécialisé membres besoin autour des modèles de classe à être explicitement spécialisées ainsi. Vous devez donc vous dire la chose suivante, qui ne serait que de spécialiser les membres de
X<int>
.Si vous souhaitez conserver les environs modèle non spécialisé, vous avez plusieurs choix. Je préfère les surcharges
type<>
wrapper? ne pouvait pas, un casting de un 0 à un pointeur de typeT
faire l'affaire? Je suppose que ce n'est pas aussi élégant...template<typename T> void get_as(T*); void get_as(double*);
et passer un(T*)0
.Si l'on est capable d'utiliser
std::enable_if
nous pouvions compter sur SFINAE (substitution de l'échec n'est pas une erreur)qui fonctionne de la sorte:
Le laid, c'est que, avec toutes ces enable_if qu'une spécialisation doit être disponible pour le compilateur sinon homonymie erreur de se produire. C'est pourquoi le comportement par défaut "obtenir que T" doit également permettre si.