Pourquoi operator = n’est pas hérité d’une classe de template

J’ai le code de modèle suivant:

class ClassName{}; template  class TemplatePtr { public: void operator=(T* p) { } }; class TemplatePtr_ClassName: public TemplateePtr { public: ~TempaltePtr_ClassName(); }; void Test() { TemplatePtr_ClassName data; data = new ClassName; } 

mais la compilation échoue avec le message d’erreur (VS2008):

erreur C2679: binary ‘=’: aucun opérateur trouvé qui prend un opérande de droite du type >> ‘NomClasse *’ (ou aucune conversion acceptable)

Pourquoi cela ne fonctionne-t-il pas alors que j’ai défini un opérateur dans la classe de base du modèle?

operator = est toujours masqué par l’implémentation de la classe dérivée sauf si une déclaration d’utilisation explicite est fournie. Cela est vrai pour les modèles de classe et les classes ordinaires.

BTW, votre déclaration d’opérateur = est très non standard. Il est généralement déclaré ainsi pour une classe ‘A’.

 A& operator=(A const &); 

Voici quelque chose qui peut être ce que vous recherchez (et comstack)

 template  class TemplatePtr { public: TemplatePtr& operator=(TemplatePtr const &) {return *this;} }; template class TemplatePtr_ClassName: public TemplatePtr { public: ~TemplatePtr_ClassName(){}; TemplatePtr_ClassName& operator=(TemplatePtr_ClassName const &that){ TemplatePtr::operator=(that); // invoke base class assignment operator return *this; } }; int main() { TemplatePtr_ClassName data; data = *new TemplatePtr_ClassName; // delete stuff } 

Il est hérité. Toutefois, l’opérateur d’affectation généré par le compilateur pour TempaltePtr_ClassName masque l’opérateur hérité. Vous pouvez le rendre visible en ajoutant

 using TempaltePtr::operator=; 

à votre classe dérivée.