2010-12-02 11 views
5

Bien ... primero voy a explicar algo sobre cómo es la arquitectura que busco. StatMgrC++ ¿Cómo puedo usar colecciones de plantillas de objetos de plantilla con herencia?

Estoy tratando de implementar un Administrador de estadísticas para mis objetos de Estadísticas. Este gestor de estadísticas está diseñado usando plantillas (ver declaración en la imagen). StatMgr contiene un mapa (no STL) que mapea una implementación de cadena a un puntero inteligente (que también es una plantilla), ARef. Las subclases específicas de StatMgr declaran estáticamente la clase de plantilla de su StatMgr padre en construcción (vea LStatMgr y RStatMgr), por lo que no son clases de plantilla.
Esto me permite hacer cosas como:

LStatMgr myLStatMgr(10); 
if(myLStatMgr.remove(acKey)) 
    cout << "Remove was good" << endl; 
//No need to delete :) 

O

ARef<LStat> oLStat = NULL; 
myLStatMgr.getNextStat(acKey,oLStat); 
if(oLStat != NULL) 
    oLStat->doSomethingLStatLike(); 

Sin embargo eso fue antes de enlazador señor y el compilador señora decidieron unir fuerzas y frustrar mis intentos de progreso (todavía tengo que probar la funcionalidad y el uso de la memoria!).
tal y como está tengo el siguiente error y advertencia por clase de estadísticas:.

\ StatsMgr.cpp (740): advertencia C4661: 'vacío StatsMgr :: VPrint()': no ​​ definición adecuada previsto petición explícita de instancias plantilla
\ StatsMgr.cpp (740):. advertencia C4661: 'vacío StatsMgr :: VPrint()':. ninguna definición adecuada prevista explícita plantilla de solicitud de creación de instancias
\ StatsMgr.cpp (104): error C2084: función 'StatsMgr :: StatsMgr (const enum doCollect, const int)' ya tiene un cuerpo
\ StatsMgr.cpp (104):. error C2084: función 'StatsMgr :: StatsMgr (const enum doCollect, const int) 'ya tiene un cuerpo

Ahora con respecto a las advertencias :: en la línea 740 que hay por lo delarations como:

template class StatsMgr<LStat>; 
template class StatsMgr<RStat>; 

he añadido esto porque si no lo hago hacer eso, entonces termino con un lío de errores del enlazador (los veo a continuación). Sin embargo, existen declaraciones e implementaciones de vPrint() en todas las subclases de Stat.

En cuanto a los errores: La clase base "StatsMgr" tiene un COTR definido, al igual que las subclases (LStatMgr & RStatMgr). ¿Por qué la herencia no solo resuelve esto? Obviamente, esto tiene algo que ver con las instancias de plantilla explícitas al final del CPP, pero no puedo entender qué está sucediendo exactamente.
abajo es del StatsMgr.cpp

template<class type> 
StatsMgr<type>::StatsMgr(const doCollect eOption, const int nListSize) : 
    oMyMap(wHashString, nListSize), oMyMapIter(oStatsList) 
{ 
    m_eCollectionOption = eOption; 
} 

A continuación se muestra de LStatMgr.CPP

LStatMgr::LStatMgr(const doCollect eOption, const int nListSize) : 
StatsMgr<LStat> (eOption, nListSize) 
{ 
} 

he intentado sustituir

class LStatMgr; 
class RStatMgr; 

de las declaraciones de plantilla y esto se pasa los errores de compilación, pero entonces el enlazador no puede encontrar ninguna función no se reemplaza. Por ejemplo, si tengo una función en StatMgr llamada "getNextStat()" y anulo eso en RStatMgr pero no en LStatMgr, entonces el enlazador se queja de eso. ¿Por qué la herencia no cubre esta situación?



Me pone triste. Puede que tenga que recurrir a la composición (lo que debería ser preferido, pero no en esta situación).
Por cierto ... estoy compilando con MSVC++ 4.1 (!!!), así que entiendo si no puedes duplicar, pero por favor ayuda.
Gracias,
Dennis. (perdón por la publicación muy larga)

+0

lectura por encima del que tengo que hacer la siguiente clara: statmgr es una clase de plantilla: clase statmgr {...} Subslasses de statmgr no son ... por ejemplo: LStatMgr clase: statmgr pública { ...} – Dennis

+0

debería poder editar su pregunta si desea agregar más información –

+0

@Steve - Cheers, también lo hizo. :) – Dennis

Respuesta

2

Ponga el código de la plantilla directamente en el encabezado, no en un archivo CPP separado.

Ver this previous question para el fondo.

EDITAR: por cierto Veo que está en un compilador muy antiguo - este problema puede ser insuperable, incluso el VC6 era incompleto para las plantillas.

+0

Gracias Steve, voy a dar una oportunidad mañana. Tiempo para la fiesta de Navidad ... (hora irlandesa). Te lo haré saber. – Dennis

+1

Quiere decir "mañana por la tarde", entonces ... –

+0

Esto funcionó. :) En y probado por 11am ... bastante bueno teniendo en cuenta la fiesta de anoche ... Cheers Steve. – Dennis

Cuestiones relacionadas