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

C++ Discussion :

templates et opérateurs.


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut templates et opérateurs.
    Bonjour à tous.
    J'ai déclaré un opérateur comme ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename Type, unsigned int L, unsigned int C, bool Static>
    bool operator!=(const typename Matrix<Type,L,C,Static>::const_iterator& first, const typename Matrix<Type,L,C,Static>::const_iterator& second);
    Et dans le main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    #include <iostream>
    #include "Matrix.hpp"
     
    typedef Matrix<float, 4,4, true> Mat;
     
    int main()
    {
        Mat m;
        Mat::const_iterator it=m.begin();
        Mat::const_iterator it2=m.end();
        bool t= it!=it2);
        return 0;
    }
    Et j'obtiens :

    error: no match for 'operator!=' in 'it != it2'

    Je ne comprends pas pourquoi il n'appelle pas ma fonction template.
    Cependant, ceci marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool operator!=(const Matrix<float,4,4,true>::const_iterator& first, const Matrix<float,4,4,true>::const_iterator& second);
    Quelqu'un sait-il pourquoi ma fonction ne marche pas ?

    Je compile avec Mingwgcc4.5 avec -std=c++0x, -pedantic-errors -Wall ...

    Merci à tous.

  2. #2
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Cependant, ceci marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    template<typename T>
    bool operator!=(const T& first, const T& second);
    Mais n'est pas vraiment pratique...

  3. #3
    screetch
    Invité(e)
    Par défaut
    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< int i >
    struct A
    {
        struct B
        {
        };
    };
     
     
    template< int i > bool operator !=(const typename A<i>::B& b1, const typename A<i>::B& b2) { return false; }
    template< int i > bool operator !=(const A<i>& a1, const A<i>& a2) { return false; }
     
    int main()
    {
        A<0> a1;
        A<0> a2;
        a1 != a2;
     
        A<0>::B b1;
        A<0>::B b2;
        b1 != b2;
    }
    ca ne marche pas car dans le cas d'une classe "nested", le compilateu n'arrive pas a déduire automatiquement les arguments.
    La seule solution que je vois comme ca (mais je suis fatigué alors y'en a ptetre d'autres ) c'est de mettre l'opérateur != dans la classe au lieu de la fonction libre

  4. #4
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Ok, merci screetch. J'avais espérer qu'il y aurait une autre solution...
    Je me demande quand même pourquoi le compilateur n'est pas capable de trouver la "nested". Bizarre de n'avoir aucun warning comme quoi la fonction ne sert à rien telle quel.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Par défaut
    Citation Envoyé par NoIdea Voir le message
    Ok, merci screetch. J'avais espérer qu'il y aurait une autre solution...
    Je me demande quand même pourquoi le compilateur n'est pas capable de trouver la "nested". Bizarre de n'avoir aucun warning comme quoi la fonction ne sert à rien telle quel.
    Il suffit de se demander : est-ce que toi, a qui on présente une classe X, est capable de dire que X est nested ou pas ? C'est la question à laquelle le compilateur doit répondre, parce qu'il n'a aucunement conscience du type de l'itérateur que tu lui passe. Ou plus exactement, découvrant un itérateur, il n'a aucune chance de savoir que cet itérateur est nested dans une classe matrice (réflexion : et si tu fais typedef std::vector<float>::iterator iterator dans ta classe matrice ?).
    [FAQ des forums][FAQ Développement 2D, 3D et Jeux][Si vous ne savez pas ou vous en êtes...]
    Essayez d'écrire clairement (c'est à dire avec des mots français complets). SMS est votre ennemi.
    Evitez les arguments inutiles - DirectMachin vs. OpenTruc ou G++ vs. Café. C'est dépassé tout ça.
    Et si vous êtes sages, vous aurez peut être vous aussi la chance de passer à la télé. Ou pas.

    Ce site contient un forum d'entraide gratuit. Il ne s'use que si l'on ne s'en sert pas.

  6. #6
    Membre éclairé

    Profil pro
    Inscrit en
    Avril 2010
    Messages
    356
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2010
    Messages : 356
    Par défaut
    Il suffit de se demander : est-ce que toi, a qui on présente une classe X, est capable de dire que X est nested ou pas ?
    Si j'ai tous les headers, il me semble que oui.

    Je ne vois pas la difficulté supplémentaire (pour le compilateur) entre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T> struct f;
    template<typename R, typename O, typename ...Args>
    struct f<R(F::*O)(Args...)>
    {};
    et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    template<typename T> struct f;
    template<typename O, typename I>
    struct f<O::I>
    {};
    Je parle avec des struct et non des fonctions mais cela ne change pas grand chose (du moins je pense).

Discussions similaires

  1. Surcharge d'opérateur dans une classe template
    Par Opérateur dans le forum Langage
    Réponses: 6
    Dernier message: 22/12/2008, 03h26
  2. Opérateur template "undefined"
    Par Ch@hine dans le forum Langage
    Réponses: 6
    Dernier message: 20/04/2008, 18h19
  3. Opérateur new[] et template
    Par progfou dans le forum Langage
    Réponses: 29
    Dernier message: 08/03/2007, 11h31
  4. Réponses: 13
    Dernier message: 29/09/2006, 16h10
  5. Opérateur template ?
    Par Médinoc dans le forum Langage
    Réponses: 6
    Dernier message: 09/03/2006, 12h03

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