2010-03-27 3 views
5

Ich habe ein Problem, ich denke, ein ganz bestimmtes.virtuelle Methoden und Vorlagenklassen

Ich habe 2 Klassen bekam, ein B aseclass und D erived Klasse (von B aseclass). B ist eine Template-Klasse (oder Klassen-Template) und hat eine rein virtuelle Methodevirtual void work(const T &dummy) = 0; Die D erived Klasse soll diese neu zu implementieren, sondern als D ist abgeleitet von B statt D ist eine andere Vorlagenklasse, der Compiler spuckt mich an, dass virtuelle Funktionen und Vorlagen nicht gleichzeitig funktionieren.

Irgendwelche Ideen, um zu erreichen, was ich will?

Ich bin dankbar für alle Gedanken und Ideen, vor allem, wenn Sie bereits das Problem

arbeitet

dieser Klasse ist auch bekannt als AS festgelegt ist, kann ich das nicht bearbeiten, ohne vorhandene Codebasis zu brechen

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

nehmen int * als Beispiel

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

Edit: Der Compiler sagt mir, dass void B<T>::work(const T&)[with T = int*] ist p ure virtuelle innerhalb D

+0

Lesen Sie hier, warum es noch nicht für mich arbeiten (wie versucht, dies mit Qt-Klassen), Mangel Qt Design ... http://lists.trolltech.com/qt-interest/2006 -02/thread00693-0.html – drahnr

+0

und siehe hier http://doc.trolltech.com/qq/qq15-academic.html am Ende muss ich alte bösen void * anstelle von Vorlagen verwenden ... – drahnr

Antwort

9

Sie platziert die Const an der falschen Stelle. Versuchen

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

const int* die gleiche wie int const* ist, das heißt, es die const int mit dem zuordnet und nicht den Zeiger.

1

Versuchen:

int* const& dummy 
+0

Tut dies wirklich wichtig, ich meine, ich habe es so gemacht wie oben, seit ich C++ gelernt habe und niemand sich bisher beschwert hat ... bis jetzt ... Gibt es eine Dokumentation und Best Practice für const? – drahnr

+4

Es ist der Unterschied zwischen "const Zeiger auf ein int" und "ein Zeiger auf ein const int" –

+0

Addition: 'const' ist verbindlich nach links, es sei denn nach links ist nichts, dann bindet es nach rechts (das ist die häufigste Verwendung) – drahnr

0

Welche Compiler?

g ++ 4.4 nicht bemängeln:

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: Natürlich - der Fehler auftauchten, nur wenn D tatsächlich instanziiert wird, festgelegt durch das Schlüsselwort const bewegt:

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 Weil Sie die Vorlagen nicht verwendet haben. –

0

Sie haben eine Mischung aus Const- und Referenzproblemen. Die folgenden compiliert:

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); 
}