“non valide utilisation incomplète de type” erreur partielle de la spécialisation de modèle
Le code suivant:
template <typename S, typename T>
struct foo {
void bar();
};
template <typename T>
void foo <int, T>::bar() {
}
me donne l'erreur
invalid use of incomplete type 'struct foo<int, T>'
declaration of 'struct foo<int, T>'
(Je suis en utilisant gcc.) Est ma syntaxe pour une partie de la spécialisation de mal? Notez que si je supprime le deuxième argument:
template <typename S>
struct foo {
void bar();
};
template <>
void foo <int>::bar() {
}
puis il compile correctement.
Vous devez vous connecter pour publier un commentaire.
Vous ne pouvez pas partiellement spécialiser une fonction. Si vous le souhaitez sur une fonction membre, vous devez partiellement spécialiser l'ensemble du modèle (oui, c'est énervant). Sur une grande basé sur un modèle de classe, partiellement spécialiser une fonction, vous avez besoin d'une solution de contournement. Peut-être basé sur un modèle membre de la structure (par exemple,
template <typename U = T> struct Nested
) serait de travailler. Sinon, vous pouvez essayer de dériver à partir d'un autre modèle que partiellement spécialisé (travaux si vous utilisez lethis->member
notation, sinon vous rencontrerez des erreurs du compilateur).Bien que coppro mentionné deux solutions déjà et Anonyme, a expliqué le deuxième, il m'a fallu un certain temps pour comprendre la première. Peut-être que le code suivant est utile pour quelqu'un de tomber sur ce site, qui continue à dominer le classement élevé dans google, comme moi. L'exemple (passage d'un vecteur/matrice/unique élément de numericalT comme dataT et puis accède à partir de [] ou directement) est bien sûr un peu artificiel, mais doivent illustrer comment vous pouvez réellement très proches partiellement spécialisé d'une fonction membre en l'enveloppant dans une partie de classe spécialisée.
Si vous avez besoin de spécialiser partiellement un constructeur, vous pouvez essayer quelque chose comme:
Note: ceci a été anonymisées à partir de quelque chose que je suis en train de travailler sur. Vous pouvez également utiliser cette option lorsque vous avez un modèle de classe avec beaucoup, beaucoup de membres et vous voulez juste ajouter une fonction.