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 ==.

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;
  }
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.
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

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 .....
}
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 !!!!

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 ?