mwi enfin vu la question je pensais pas qu'il allait falloir un dessin... bon alors mettons un truc comme ça :
#include <map>
class Test
{ };
template <typename A, typename B>
class MaClasse
{
public:
B MaFonction (const A& ) const;
private:
typedef std::map<A, B> t_map;
t_map hash;
};
template <typename A, typename B>
B
MaClasse<A, B>::MaFonction (const A& a) const
{
typename t_map::const_iterator i;
if ((i = hash.find (a)) == hash.end ())
return 0;
return i->second;
}
int main ()
{
MaClasse<int, Test*> mc;
mc.MaFonction (0);
return 0;
}
Voilà, dans ce cas ça marche puisque "return 0" est compatible avec le type "Test*" (même chose si il existe un constructeur à partir d'un entier pour le type choisi, d'ailleurs); mais ça ne marchera pas si je template avec "Test", par exemple.
Du coup je voudrais avoir deux implémentations de "MaFonction", dont l'une soit spécialisée pour les pointeurs (l'implémentation actuelle, du coup le "return 0" sera forcément valable), et une autre qui remplace le "return 0" par un throw, par exemple, mais je ne connais pas la syntaxe.