2010-12-02 34 views
5

Ok ... tout d'abord je vais juste vous expliquer quelque chose sur ce que l'architecture que je suis après ressemble. J'essaie de mettre en œuvre un gestionnaire de statistiques pour mes objets Stats. Ce gestionnaire de statistiques est conçu à l'aide de modèles (voir déclaration sur la photo). Le StatMgr contient une carte (non STL) qui mappe une implémentation de chaîne sur un pointeur intelligent (qui est également un modèle), ARef. Les sous-classes spécifiques de StatMgr déclarent statiquement la classe modèle de leur StatMgr parent lors de la construction (voir LStatMgr et RStatMgr), et donc elles-mêmes ne sont pas des classes de modèles.
Cela me permet de faire des choses comme:C++ Comment puis-je utiliser des collections de modèles d'objets modèles avec héritage?

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

OU

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

Cependant c'était avant linker mister et compilateur Madame a décidé d'unir leurs forces et de contrecarrer mes tentatives de progrès (je dois encore tester la fonctionnalité et l'utilisation de la mémoire!).
En l'état actuel, j'ai l'erreur et avertissement suivant par classe stat:.

\ StatsMgr.cpp (740): avertissement C4661: «vide StatsMgr :: VPRINT(): pas appropriée définition prévu à la demande d'instanciation explicite modèle
\ StatsMgr.cpp (740):. avertissement C4661: 'vide StatsMgr :: VPRINT()'. pas appropriée définition donnée à la demande d'instanciation explicite modèle
\ StatsMgr.cpp (104): erreur C2084: fonction 'StatsMgr :: StatsMgr (const Enum doCollect, const int)' a déjà un corps
\ StatsMgr.cpp (104):. erreur C2084: fonction « StatsMgr :: StatsMgr (const Enum doCollect, const int) 'a déjà un corps

maintenant en ce qui concerne les mises en garde :: à la ligne 740 il y a des delarations comme si:

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

j'ai ajouté parce que si je ne fais cela alors je me retrouve avec un tas d'erreurs d'éditeur de liens (voir ci-dessous). Cependant il y a des déclarations et des implémentations de vPrint() dans toutes les sous-classes Stat!

En ce qui concerne les erreurs: La classe de base "StatsMgr" a un COTR défini, tout comme les sous-classes (LStatMgr & RStatMgr). Pourquoi l'héritage ne fait-il pas simplement le tri? Évidemment, c'est quelque chose à voir avec les instances de modèle explicites à la fin du RPC, mais je ne peux pas comprendre ce qui se passe exactement.
Ci-dessous est de StatsMgr.cpp

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

Ci-dessous de LStatMgr.cpp

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

j'ai essayé substituer

class LStatMgr; 
class RStatMgr; 

pour les déclarations de modèle et cela est transmis les erreurs de compilation mais l'éditeur de liens ne peut pas trouver toutes les fonctions non-substituée. Par exemple si j'ai une fonction dans StatMgr appelée "getNextStat()" et remplacez cela dans RStatMgr mais pas dans LStatMgr, alors l'éditeur de liens s'en plaint. Pourquoi l'héritage ne couvre-t-il pas cette situation?



Cela me rend triste. Il se peut que je doive revenir à la composition (ce qui devrait être préféré, mais pas dans cette situation). Par ailleurs ... Je compile avec MSVC++ 4.1 (!!!), donc je comprends si vous ne pouvez pas dupliquer, mais s'il vous plaît aidez.
Merci,
Dennis. (désolé pour le poste très long)

+0

Relecture sur ce que je dois faire ce qui suit clairement: statmgr est une classe de modèle: classe statmgr {...} Subslasses de statmgr ne sont pas ... par exemple: classe LStatMgr: statmgr publique { ...} – Dennis

+0

vous devriez être en mesure de modifier votre question si vous souhaitez ajouter plus d'informations –

+0

@Steve - Cheers, a fait cela aussi bien. :) – Dennis

Répondre

2

Placez le code du modèle directement dans l'en-tête et non dans un fichier CPP distinct.

Voir this previous question pour le fond.

EDIT: btw Je vois que vous êtes sur un très vieux compilateur - ce problème peut être insurmontable, même VC6 était sommaire pour les templates.

+0

Merci Steve, je vais essayer demain. Temps pour la fête de Noël ... (temps irlandais). Je te le ferai savoir. – Dennis

+1

Vous voulez dire 'demain après-midi', alors ... –

+0

Cela a fonctionné. :) Dans et testé par 11am ... très bon départ vu la fête la nuit dernière ... Cheers Steve. – Dennis