J'ai un problème avec la spécialisation du modèle que je voudrais comprendre. Je travaille avec Visual C ++ 10.0 (2010). J'ai une classe comme celle-ci: en théorie, car je suis spécialisé la méthode "get", le linker doit pouvoir récupérer à partir d'un fichier d'objet. Au lieu de cela, je reçois une erreur de référence non résolue avec la liaison si je place la méthode dans le fichier source: p> si je place cette méthode dans le fichier d'en-tête comme inline, la construction va bien bien. Je comprends que ce modèle fonctionne comme ceci: p> doit être placé dans l'en-tête car le compilateur ne sera pas en mesure de spécialiser le modèle en fonction du code d'appel, mais Le cas d'une spécialisation complète Il s'agit de la mise en œuvre de la classe qui fait donc que la méthode du modèle spécialisé doit déjà exister en tant que symbole public. Quelqu'un pourrait-il jeter une lumière sur cette question? P> p>
3 Réponses :
Spécialiser un modèle ne force pas le compilateur à l'instancier (je pense que GCC); Vous devez toujours dire explicitement au compilateur d'instancier réellement le modèle. Vous pouvez le faire avec une instanciation de modèles explicite. Fondamentalement, il suffit d'ajouter ceci dans le fichier source:
c'est faux. Il la spécialisa donc qu'il n'a pas besoin ni vouloir instancier le modèle
Litb a raison, c'est vraiment faux, mais je laisserai ma réponse ici afin que d'autres puissent voir que c'est faux aussi
Méthode commençant par Si vous souhaitez le mettre dans un fichier de mise en œuvre, vous devez surcharge forte> IT. P> Modèle code> est toujours considéré comme un modèle
code> Spécialisation forte> méthode. Donc, vous devez avoir à mettre dans un fichier d'en-tête.
class VariableManager
{
//...
VarT get(std::string const& name) const
{}
std::string get(std::string const& name) const; //overloading not specialization
};
Non tu ne le fais pas. Voir la réponse de Reko. Et je ne suis pas sûr de ce que vous essayez d'entendre par "Méthode de spécialisation des modèles".
( mais b> Je recommanderais de surcharger sur la spécialisation n'importe quel jour i>!)
@Tomalak, l'OP tente de spécialiser le modèle code> méthode code> obtenir code> dans la question. Ma réponse est que les méthodes spécialisées devraient être déclarées dans les fichiers d'en-tête. Pouvez-vous préciser plus, qu'est-ce qui ne va pas?
@iammilind: voir la réponse du litb, il l'explique bien. Le problème avec la spécialisation du modèle qu'il a fait était parce que ce n'est pas vraiment autorisé à le faire de cette façon. La spécialisation explicite doit être effectuée dans la portée des espaces de noms, mais pour une raison quelconque, MSVC ne donne aucune erreur de spécialisation en classe. S'il le faisait correctement, cela fonctionnerait bien, même si le code n'est pas dans le fichier d'en-tête. C'est ce qui n'allait pas sur votre réponse; Vous n'avez pas besoin d'avoir le code dans l'en-tête, car une spécialisation explicite n'est pas vraiment un modèle, juste une fonction régulière.
Votre analyse est correcte - un modèle de fonction explicitement spécialisé contenant tout paramètre de modèle spécifié avec des valeurs explicites fournit une définition complète d'une fonction.
Si vous avez correctement inclus le fichier Permettez-moi également de noter que vous ne pouvez pas appeler CPPP code> correspondant contenant la définition de la spécialisation explicite dans votre projet, VC ++ ne doit pas élever une erreur de liaison. Pour la conformité aux normes, permettez-moi de noter que vous devez déclarer votre spécialisation dehors em> de la classe entourant. La norme interdit de déclarer des spécialisations explicites à l'intérieur de la classe jointe (et d'autres compilateurs rejeteront votre code). Changez donc le fichier d'en-tête pour déclarer la spécialisation comme celle-ci, à la place p>
obtenir
Drôle, mais il semble que la question de conformité standard était le problème. J'ai supprimé la Déclaration de la classe et j'ai formulé la déclaration de spécialisation comme vous l'avez suggéré, et la liaison n'avait aucun problème. Il est bon de se rappeler que les spécialisations doivent être déclarées en dehors de la portée de la classe. Merci pour votre aide!
C'est une vraie chance pour moi de trouver votre réponse. C'est toujours un mystère pour moi ce que le compilateur fait si je quitte la spécialisation du modèle à l'intérieur d'une classe et ce qui permet à la liante de ne pas la trouver. Cependant, vous avez définitivement sauvé ma journée!