43Fermer45
ZephLe 03/01/2016 à 14:36
Réponse en deux parties : pourquoi ça marche pas, et pourquoi à ta place je n'utiliserais pas un template ici :

1 - Ça ne fonctionne pas parce que tu as appliqué ton template sur une classe et non sur une méthode. Du coup si tu veux faire de la spécialisation de template, c'est à dire faire ce que tu fais plus tard en définissant un comportement particulier pour les types SDL_Surface* et SDL_Texture* il faut que tu le fasses pour l'intégralité de la définition de la classe (= toutes ses méthodes, y compris constructeurs et destructeurs). L'explication est que deux spécialisations différentes (par exemple ResourceHolder<A> et ResourceHolder<B>) n'ont aucun code en commun, il s'agit de deux classes indépendantes dans ton code et l'une ne peut pas magiquement utiliser du code de l'autre quand tu oublies de le définir. Après compilation, c'est la même chose que si tu avais déclaré deux classes ResourceHolderA et ResourceHolderB sans aucune relation entre elles.

2 - À ta place j'éviterais d'utiliser un template ici, et même de façon plus générale j'éviterais d'utiliser des templates à moins d'être vraiment certain que c'est une bonne réponse à ton problème. L'une des raisons est que les templates sont très complexes à lire ET à écrire, et avant de nuire autant à la maintenabilité de ton code il faut que tu sois convaincu que ça vaille le coup. Ici ça me semble un peu artificiel : tu as deux types qui ont une utilisation plus ou moins similaire (SDL_Texture et SDL_Surface), du coup tu as très envie de faire une classe générique pour les encapsuler. Sauf qu'elle n'est pas générique (= réutilisable) du tout, puisque finalement tu es obligé de déplacer tout le code intéressant dans les spécialisations et il ne reste quasiment plus rien dans la partie générique (et ça va devenir encore pire quand tu auras corrigé ton problème). Tu peux surement écrire une fonction template qui te rendra l'écriture un peu plus agréable, puis éventuellement une classe générique (mais celle fois réellement, c'est à dire une classe pour laquelle tu peux écrire toute la définition sans avoir à spécifier le type de ses paramètres template) qui l'utilisera.