Bonjour,

J'ai codé une classe template permettant d'accéder à une table de base de données.

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
 
template <class T>
class IDbfIO
{
public:
	/// \brief Ecrit un enregistrement (non impl)
	virtual writeRecord( const T & data )
	{
	}
 
	/// \brief Modifie un enregistrement (non impl)
	virtual void editRecord( const T & data )
	{
	}
 
	/// \brief Lit un enregistrement (non impl)
	virtual void readCurrentRecord( T & data )
	{
	}
 
	/// \brief Lit tous les enregistrements dans un vecteur
	virtual void readAllRecords( vector<T> & aData )
	{
		int i = 0;
		aData.resize( m_pTable->RecordCount );
 
		m_pTable->First();
 
		// lecture du fichier
		while ( !m_pTable->Eof )
		{
			readCurrentRecord( aData.at( i ) );
			i++;
			m_pTable->Next();
		}
	}
 
	/// \brief Lit tous les enregistrements dans une map
	virtual void readAllRecords( map<AnsiString,T> & mapData )
	{
		AnsiString strKey = "";
		T data;
 
		m_pTable->First();
 
		// lecture du fichier
		while ( !m_pTable->Eof )
		{
			readCurrentRecord( strKey, data );
 
			if( !mapData.count( strKey ) )
			{
				mapData[strKey] = data;
			}
			else
			{
                                             //log
			}
 
			m_pTable->Next();
		}
	}
};
Cette architecture a un double intérêt :
- me permettre de factoriser du code ( par exemple : les fonctions lisant l'intégralité de la table ).
- forcer les classes filles implémentant IDbfIO a surcharger des fonctions (par exemple : readCurrentRecord() ).

Par exemple voici une classe fille :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
 
class CDbfService : public IDbfIO<CDataService>
{
public:
	CDbfService();
	~CDbfService();
 
	/// \brief Specialisation de lecture pour les CDataService
	/// \param data : donnees du service
	void readCurrentRecord( CDataService & data );
};
Elle supplante readCurrentRecord(). Jusque là pas de soucis, c'est lorsqu'elle supplante readAllRecords( vector<CDataService> & aData ) que j'ai un soucis.

En effet, j'ai une warning me précisant que la fonction readAllRecords( map<AnsiString,T> & mapData ) est cachée.

J'ai donc creusé le sujet et compris qu'il fallait que je rajoute la ligne

Code : Sélectionner tout - Visualiser dans une fenêtre à part
using CDbfIO::readAllRecords( map<AnsiString,T> & mapData );
dans la classe fille pour que la fonction virtuelle ne soit plus cachée.

Néanmoins le compilateur de C++ builder 2010 me jette lorsque j'ajoute cette ligne de code. Sachant que j'ai également essayé d'ajouter :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
using CDbfIO<T>::readAllRecords( map<AnsiString,T> & mapData );
et

Code : Sélectionner tout - Visualiser dans une fenêtre à part
using CDbfIO<CDataService>::readAllRecords( map<AnsiString,CDataService> & mapData );
Pensez-vous que c'est une erreur syntaxe de ma part ou une limitation du compilateur de C++ builder 2010 ?

A noter que pour l'instant je m'en suis tiré en déclarant, dans IDbfIO, les fonctions :

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
virtual void readAllRecordsInVector( vector<T> & aData )
virtual void readAllRecordsInMap( map<AnsiString,T> & mapData )
au lieu de

Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
 
virtual void readAllRecords( vector<T> & aData )
virtual void readAllRecords( map<AnsiString,T> & mapData )
Mais je trouve cette solution lourde car elle m'oblige à créer une nouvelle fonction pour chaque type de conteneur alors que je voulais juste surchargé la fonction readAllRecords().

Merci d'avance !