IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Langage C++ Discussion :

Class template et specialisation d'operateur


Sujet :

Langage C++

  1. #1
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 45
    Points
    45
    Par défaut Class template et specialisation d'operateur
    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 ?

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Les spécialisations devraient figurer dans le même header :
    http://cpp.developpez.com/faq/cpp/?p...VERS_templates

  3. #3
    Membre du Club
    Inscrit en
    Mai 2010
    Messages
    23
    Détails du profil
    Informations forums :
    Inscription : Mai 2010
    Messages : 23
    Points : 45
    Points
    45
    Par défaut
    Merci @cob59,
    Effectivement, sans changer la définition de ma classe,
    J'ai simplement dans le header ou se trouvait le modele rajouter la declaration de 2 specialization

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    template<> bool CVector<float>::operator == (const CVector<float>& roV) const;
      template<> bool CVector<double>::operator == (const CVector<double>& roV) const;
      template<typename T> bool CVector<T>::operator == (const CVector<T>& roV) const
      {
      blabla ...
    }
    et hop plus de problème de linkage!!!!
    Merci.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Double specialisation d'une classe templatée
    Par DakM dans le forum Langage
    Réponses: 1
    Dernier message: 20/12/2012, 02h27
  2. Réponses: 3
    Dernier message: 07/10/2012, 20h09
  3. [Template] specialisation de classe template
    Par vandamme dans le forum Langage
    Réponses: 3
    Dernier message: 19/10/2008, 14h22
  4. souci classe template et surcharge operateur
    Par loicounet dans le forum Langage
    Réponses: 8
    Dernier message: 28/04/2008, 15h01
  5. Réponses: 6
    Dernier message: 06/10/2004, 12h59

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo