Je peux spécialiser un destructor pour un cas, mais je vais avoir du mal à dire au compilateur d'utiliser simplement un destructor normal pour tout autre cas:Comment puis-je spécialiser un destructeur pour un seul cas, ou certains cas?
#include <iostream>
template <int = 0>
struct Foo
{
~Foo();
};
int main()
{
{
Foo<> a; // Normal destructor called
}
{
Foo<7> a; // Special destructor called
}
}
template<>
Foo<7>::~Foo() { std::cout << "Special Foo"; }
template<>
Foo<>::~Foo() {} // Normal destructor does nothing.
Cela fonctionne très bien, mais maintenant si j'ajoute un autre argument de modèle par exemple Foo < 3> a; alors l'éditeur de liens dit qu'il ne peut pas trouver la définition du destructeur. Comment puis-je juste dire que je veux un destructeur spécial juste pour le numéro 7, et gérer tous les autres cas avec un destructeur normal?
J'ai essayé:
Foo::~Foo() {} // Argument list missing
Foo<int>::~Foo() {} // Illegal type for non-type template parameter
template<>
Foo<int>::~Foo() {} // Same thing
template<int>
Foo<>::~Foo() {} // Function template has already been defined
Très très doux, merci. Peuvent-ils être définis en ligne dans la classe elle-même comme des fonctions de classe normales/non-basées? – Zebrafish
@Zebrafish Bien sûr que oui. – songyuanyao
J'ai déjà accepté votre réponse, mais j'ai du mal à la définir dans la classe comme vous l'avez dit. Si cela ne vous pose pas trop de problèmes, pourriez-vous juste donner un extrait rapide d'une définition dans le Foo struct inline? Le code est déjà configuré dans le lien LIVE que vous avez donné. – Zebrafish