Bonjour, j'aimerais savoir si qqu'un aurait une idée pour résoudre le problème suivant (noter que j'ai volontairement coupé tout ce qui n'était pas nécessaire car la seule description de la classe fait 160 lignes !).
J'ai un template de Vector qui definit entre autre un operator ==.
Jusqu'ici tout va bien, cette description est dans un .h et VS'2008 générait très bien le code de la classe.
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 template<typename T> class CVector : public boost::numeric::ublas::vector<T> { bool operator == (const CVector<T>& roV) const; } template<typename T> bool CVector<T>::operator == (const CVector<T>& roV) const { if(this->size() != roV.size()) { return false; } for(unsigned int ui = 0 ; ui < this->size() ; ui++) { if((*this)(ui) != roV(ui)) { return false; } } return true; }
Maintenant, J'ai noté que pour les types float et double un operateur == specifique était nécessaire pour par exemple remplacer (a == b) par fabs(a-b) < std::epsilon<float> ou double.
J'ai essayé d'implementer dans un .cpp
Le problem est que le compilo de Visual Studio créé une version de l'implementation de == à partir de du Template et du coup je me retrouve à avoir plusieurs version de l'operateur, ce qui pose un problème de linkage !!!!
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9 template<> bool CVector<float>::operator == (const CVector<float>& roV) const { blahblah ..... } template<> bool CVector<double>::operator == (const CVector<double>& roV) const { blahblah ..... }
donc la question est comment puis-je créer des implementations specifiques d'un operateur pour un type T donnée sans avoir à spécialiser toute la classe ?
Partager