Suite à l'avis de @Jonas dans un previous question, je définis une classe modélisée pour contenir un conteneur arbitraire (vector, set, map, etc) d'un containee arbitraire (string, tree , etc). Jusqu'à présent, ma définition est comme ceci:Spécialisation de la fonction dans la définition du modèle avec les paramètres du modèle de template
template <template <typename...> class Container, typename Containee = std::string, typename... extras>
class Lemario
{
public:
typedef typename Container<Containee, extras...>::iterator iterator;
typedef typename Container<Containee, extras...>::const_iterator const_iterator;
// Use 'Containee' here (if needed) like sizeof(Containee)
// or have another member variable like: Containee& my_ref.
Container<Containee, extras ...> mTheContainer;
int loadContainees(const char *filename) {
Containee w, line;
// do some stuff here
}
void appendContainee(const Containee &__x);
};
Maintenant, je peux définir des méthodes les deux en ligne (comme loadContainees) l'extérieur de la définition du modèle. Extérieur:
template <template <typename...> class Container, typename Containee, typename... extras>
Containee Lemario<Container, Containee, extras...>::transform_word(const Containee& word) const
{
Containee result;
return result;
}
Jusqu'à présent, si bon. Mais maintenant je veux spécialiser une méthode pour ajouter un conteneur au conteneur comme vecteur, carte, arbre, utiliser différentes méthodes. J'essaie donc de se spécialiser std :: vector:
template <template <typename...> class Container, typename Containee, typename... extras>
void Lemario<std::vector, Word>::appendContainee(const Word & word)
{
mTheContainer.push_back(word);
}
Mais je reçois l'erreur suivante:
error: prototype for ‘void Lemario<std::vector, gong::Xtring>::appendContainee(const Word&)’ does not match any in class ‘Lemario<std::vector, gong::Xtring>’
En dehors de cela, je peux ¿spécialiser uniquement le conteneur, std :: vecteur, mais laissez le conteneur non spécialisé?
template <template <typename...> class Container, typename Containee, typename... extras>
void Lemario<std::vector, Containee>::appendContainee(const Containee & word)
{
mTheContainer.push_back(word);
}
Si je me souviens bien, vous ne peut pas spécialiser la fonction du modèle de classe séparément de la classe elle-même –
Ceci est un problème XY typique. La bonne réponse à votre question précédente était celle de Toby Speight. Vous n'avez pas besoin de cette structure compliquée ici. – Walter
** ERREUR ** 'Word' n'est pas défini. – Walter