Una vez antes, estaba seguro de que no podrías hacer esto, pero el otro día estaba jugando con algún código y parecía compilar y funcionar. Solo quiero verificar que no estoy teniendo suerte. ¿Puede una clase de plantilla tener una función virtual pura, lo que supongo que también significa que solo los métodos virtuales serían válidos también para el destructor?¿Se permiten métodos virtuales puros dentro de una clase de plantilla?
template <typename WordType> class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();
virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}
He intentado mirar hacia arriba en línea y todo lo que he podido encontrar es que no se puede tener un método virtual (puro o de otro tipo) en una clase normal, como esto:
class DataSource
{
public:
DataSource();
DataSource(DataSource const& other);
virtual ~DataSource();
template <typename WordType>
virtual void Put(
WordType const* const data,
unsigned int const wordCount) = 0;
}
Y esto se debe a la imposibilidad de administrar una tabla virtual para hacer referencia a todos los diferentes tipos de tipos posibles con los que se instanciaría este método.
Sin embargo, cuando se trata de una función de miembro virtual de una clase de plantilla, parece ser diferente porque toda la clase se "crea" a través del parámetro de plantilla cuando se instancia la variable de clase de plantilla. En este punto, el método virtual es como cualquier otro método virual de una clase debido a la naturaleza de "buscar y reemplazar" de las plantillas.
De todos modos, planteando la pregunta nuevamente en caso de que se haya perdido allí: ¿Se permiten funciones virtuales (puras o normales) dentro de una clase tempate?
Parece que ya se haya descubierto la respuesta a esta ... –
Como dije, lo juro por mí mismo que probado antes y tenía problemas. Cuando de repente funcionó, quería asegurarme de que no era solo porque estaba en un compilador diferente, diferentes banderas de advertencia/error, etc. y que estaba definido, preferiblemente, que estaba bien para el estándar. – Anthony
Además, por lo que vale, no pude encontrar nada en línea que dijera de una forma u otra. ¿Qué mejor lugar para poner esta información que SO? – Anthony