Bien que coppro ait déjà mentionné deux solutions et qu'Anonymous m'ait expliqué la seconde, il m'a fallu un certain temps pour comprendre le premier. Peut-être que le code suivant est utile pour quelqu'un qui trébuche sur ce site, qui se classe toujours haut dans google, comme moi. L'exemple (passer un vecteur/tableau/élément unique de numericT comme dataT et y accéder via [] ou directement) est bien sûr quelque peu artificiel, mais devrait illustrer comment vous pouvez vraiment vous rapprocher de la spécialisation partielle d'une fonction membre en l'enveloppant dans une classe partiellement spécialisée.
/* The following circumvents the impossible partial specialization of
a member function
actualClass<dataT,numericalT,1>::access
as well as the non-nonsensical full specialisation of the possibly
very big actualClass. */
//helper:
template <typename dataT, typename numericalT, unsigned int dataDim>
class specialised{
public:
numericalT& access(dataT& x, const unsigned int index){return x[index];}
};
//partial specialisation:
template <typename dataT, typename numericalT>
class specialised<dataT,numericalT,1>{
public:
numericalT& access(dataT& x, const unsigned int index){return x;}
};
//your actual class:
template <typename dataT, typename numericalT, unsigned int dataDim>
class actualClass{
private:
dataT x;
specialised<dataT,numericalT,dataDim> accessor;
public:
//... for(int i=0;i<dataDim;++i) ...accessor.access(x,i) ...
};