Bonsoir,
J'ai des classes template définies dans une lib statique.
J'appelle ces classes dans un exe qui doit donc se linker avec la lib, et là j'ai une erreur, j'ai cherché je ne vois vraiment pas alors j'ai réécrit une partie de ma classe sans les template et là ça marche très bien, ça se link parfaitement.
J'ai écrit un exemple simplifié qui illustre mon problème :
La classe CVector (qui n'est pas template) qui marche très bien.
La classe TVector (template) qui ne marche pas (problème de link.
fichier d'en-tête de la lib statique :
Le cpp de la lib statique :
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 #ifndef _VECTOR_H_ #define _VECTOR_H_ #include <vector> class CVector { protected: int m_nSize; std::vector<double>* m_pVec; public: CVector( ); CVector( int size ); ~CVector( ) { delete m_pVec; } void SetCoef( int i, double dValue ) { (*m_pVec)[i] = dValue; } double GetSumCoef( ) const { double dSum = 0.0; for ( int i = 0; i < m_nSize; i++ ) dSum += m_pVec->at(i); return dSum; } }; template<typename CNumeric> class TVector { protected: int m_nSize; std::vector<CNumeric>* m_pVec; public: TVector( ); TVector( int size ); ~TVector( ) { delete m_pVec; } void SetCoef( int i, CNumeric dValue ) { (*m_pVec)[i] = dValue; } double GetSumCoef( ) const { CNumeric dSum = 0.0; for ( int i = 0; i < m_nSize; i++ ) dSum += m_pVec->at(i); return dSum; } }; #endif // _VECTOR_H_
Et voici l'exécutable :
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 #include "stdafx.h" #include "vector.h" CVector::CVector( ) : m_pVec(NULL), m_nSize(0) { } CVector::CVector( int size ) { m_pVec = new std::vector<double>; for ( size_t i = 1; i <= size; i++ ) m_pVec->insert(m_pVec->end(), 0.0); m_nSize = size; } template<typename CNumeric> TVector<CNumeric>::TVector( ) : m_pVec(NULL), m_nSize(0) { } template<typename CNumeric> TVector<CNumeric>::TVector( int size ) { m_pVec = new std::vector<CNumeric>; for ( size_t i = 1; i <= size; i++ ) m_pVec->insert(m_pVec->end(), 0.0); m_nSize = size; }
Comme je le disais, toute la partie sans template marche mais la partie avec template ne marche pas ... à croire qu'il faut mettre des options différentes dans les options du projet si on utilise des template ?
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 #include "stdafx.h" #include "vector.h" int _tmain(int argc, _TCHAR* argv[]) { CVector vect(5); vect.SetCoef(0, 0); vect.SetCoef(1, 1); vect.SetCoef(2, 2); vect.SetCoef(3, 3); vect.SetCoef(4, 4); double dSum = vect.GetSumCoef(); printf("sum = %f\n", dSum); TVector<double> tVect(5); tVect.SetCoef(0, 0); tVect.SetCoef(1, 1); tVect.SetCoef(2, 2); tVect.SetCoef(3, 3); tVect.SetCoef(4, 4); dSum = tVect.GetSumCoef(); printf("sum = %f\n", dSum); return 0; }
Merci de m'aider.
Bonne nuit.
Partager