2010-03-27 7 views
5

J'ai surmonté un problème, je pense un très spécifique.méthodes virtuelles et classes de modèles

J'ai 2 classes, un B aseclass et D classe irées (de B aseclass). B est une classe de modèle (ou modèle de classe) et sa méthode virtuelle purevirtual void work(const T &dummy) = 0; Le D classe irées est censé ré-écrire, mais comme D est dérivé d'B plutôt que D étant une autre classe de modèle, le compilateur me crache que les fonctions virtuelles et les modèles ne fonctionnent pas à la fois.

Des idées pour accomplir ce que je veux?

Je suis thankfull pour toutes les pensées et les idées, surtout si vous allready travaillé sur ce problème

cette classe est fixé alias AS IS, je ne peux pas modifier cela sans casser la base de code existant

template <typename T> 
class B { 
public: 
... 
virtual void work(const T &dummy) = 0; 
.. 
}; 

prendre int * comme un exemple

class D : public B<int*>{ 
... 
virtual void work(const int* &dummy){ /* put work code here */ } 
.. 
}; 

Edit: Le compilateur me dit que void B<T>::work(const T&)[with T = int*] est p ure virtuel dans D

+0

Lisez ici pourquoi il ne fonctionne toujours pas pour moi (comme essayé avec les classes Qt), défaut de conception Qt ... http://lists.trolltech.com/qt-interest/2006 -02/thread00693-0.html – drahnr

+0

et voir ici http://doc.trolltech.com/qq/qq15-academic.html à la fin je dois utiliser vieux mal void * au lieu de modèles ... – drahnr

Répondre

9

Vous avez placé le const au mauvais endroit. Essayez

virtual void work(int* const &dummy){ /* put work code here */ } 

const int* est le même que int const*, à savoir qu'il associe la const avec l'int et non le pointeur.

1

Essayez:

int* const& dummy 
+0

vraiment important, je veux dire je l'ai fait comme ci-dessus depuis que j'ai appris le C++ et personne ne s'est plaint jusqu'ici ... jusqu'à présent ... Y a-t-il de la documentation et de bonnes pratiques pour const? – drahnr

+4

C'est la différence entre "const pointer vers un int" et "un pointeur vers un const int" –

+0

Addition: 'const' se lie à gauche, sauf si à gauche n'est rien, alors il se lie à la droite (qui est le utilisation la plus courante) – drahnr

0

compilateur?

g ++ 4.4 ne se plaignaient pas:

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(const int* &dummy){ /* put work code here */ } 
}; 

int main(){return 0;} 

EDIT: Bien sûr - l'erreur ne est apparu lors de l'instanciation effectivement D, fixe en déplaçant le mot-clé const:

template <typename T> 
class B { 
public: 
virtual void work(const T &dummy) = 0; 
}; 
class D : public B<int*>{ 
virtual void work(int* const &dummy){ /* put work code here */ } 
}; 

int main(){D d;return 0;} 
+2

@Douglas Parce que vous n'avez pas utilisé les modèles. –

0

Vous avez un mélange de const et de problèmes de référence. Les compiles suivants:

template <typename T> 
struct B { 
virtual void work(T dummy) = 0; 
}; 

struct D : public B<int*>{ 
virtual void work(int* dummy){ /* put work code here */ } 
}; 

int main() { 
    D d; 
    d.work(0); 
} 
Questions connexes