2010-03-27 19 views
5

He superado un problema, creo que es muy específico.métodos virtuales y clases de plantilla

Tengo 2 clases, un B aseclass y una D clase erived (de B aseclass). B es una clase de plantilla (o plantilla de clase) y tiene un método virtual pura virtual void work(const T &dummy) = 0; El D clase erived se supone volver a implementar esto, pero como D se deriva de B en lugar de D siendo otra clase de plantilla, el compilador me dice que las funciones virtuales y las plantillas no funcionan a la vez.

¿Alguna idea de cómo lograr lo que quiero?

estoy thankfull para cualquier pensamientos e ideas, sobre todo si ya fuiste calculado que un problema

esta clase se fija también conocido como es, no puedo editar esta sin romper base de código existente

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

int * tomar como ejemplo

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

Editar: El compilador me dice, que es void B<T>::work(const T&)[with T = int*]p ure virtual dentro de D

+0

leer aquí por qué aún no funciona para mí (como intentado esto con clases de Qt Qt), deficiencia de diseño ... http://lists.trolltech.com/qt-interest/2006 -02/thread00693-0.html – drahnr

+0

y vea aquí http://doc.trolltech.com/qq/qq15-academic.html al final tengo que usar el antiguo vacío malvado * en lugar de plantillas ... – drahnr

Respuesta

9

Usted colocó el const en el lugar equivocado. Trate

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

const int* es lo mismo que int const*, es decir, se asocia la const con el int y no el puntero.

1

Probar:

int* const& dummy 
+0

¿Esto realmente importa, quiero decir que lo hice como antes porque aprendí C++ y nadie se ha quejado hasta ahora ... hasta ahora ... ¿Hay alguna documentación y mejores prácticas para const? – drahnr

+4

Es la diferencia entre "const pointer to a int" y "un puntero a const int" –

+0

Adición: 'const' es vinculante a la izquierda, a menos que a la izquierda no sea nada, luego se une a la derecha (que es uso más común) – drahnr

0

Qué compilador?

g ++ 4.4 no se quejó:

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: Por supuesto - el error sólo aparecía cuando en realidad una instancia de D, fijo moviendo la palabra clave 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 Porque no usaste las plantillas. –

0

Tienes una mezcla de const y problemas de referencia. Los siguientes compilaciones:

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