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 :

template et conversion implicite


Sujet :

Langage C++

  1. #1
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut template et conversion implicite
    Bonjour,

    un petit souci avec les conversions implicites. J'ai un operator du type :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class E1, class E2>
    untype<E1, E2> operator+(const hybrid_expression<E1>& e1, const scalar_expression<E2>& e2) {
    //...
    }
    Avec scalar_expression une classe contenant un constructeur de conversion :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    template <class E>
    class scalar_expression
    {
     
        public:
     
            scalar_expression(const E& e) : m_e(e) {}
     
        private:
     
            const E& m_e;
    };
    Mais quand je fais l'appel :

    Avec V1 et V2 des types dérivants de hybrid_expression, le compilo ne trouve pas d'oérateur adéquat. Ca passe uniquement si je fais un opérateur du type :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    template <class E>
    un_type<E, int> operator+(const hybrid_expression<E>& e1, const int& e2) {
    //...
    }
    Apparemment le fait que l'argument de l'opérateur soit un template empêche la résolution de type. J'ai essayé également de passer par une classe de traits spécialisée du style :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    template <class E>
    class scalar_traits;
     
    template <>
    class scalar_traits<int>
    {
        typedef int type;
    }
     
    template <class E1, class E2>
    untype<E1, E2> operator+(const hybrid_expression<E1>& e1, const typename scalar_traits<E2>::type& e2) {
    //...
    }
    Même problème. Quelqu'un aurait une idée ?

    Merci d'avance.

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    Apparemment le fait que l'argument de l'opérateur soit un template empêche la résolution de type.
    En effet, car il serait nécessaire d'instancier la fonction template pour savoir depuis quoi les arguments peuvent être construits, or pour l'instancier il te faut déduire ce type.

  3. #3
    Expert confirmé

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Par défaut
    Citation Envoyé par bolhrak Voir le message
    Apparemment le fait que l'argument de l'opérateur soit un template empêche la résolution de type.
    Tu veux faire correspondre un int à un const scalar_expression<E2>&. L'algorithme utilisé pour la déduction des types templates (donc de ce que vaut E2) ne permet que très peu de conversions (ajout dans certains cas de const/volatile et dérivée->base) et pas celles définies par l'utilisateur.

  4. #4
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2006
    Messages : 366
    Par défaut
    Merci pour vos réponses. Cela m'a fait chercher une autre piste, et le problème est résolu.

    Ce code était là pour remplacer le code suivant :

    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
     
    template <class E1, class E2>
    un_type operator+(const hybrid_expression<E1>& e1, const hybrid_expression<E2>& e2) {
    //...
    }
     
    template <class E1, class E2>
    un_type1 operator+(const hybrid_expression<E1>& e1, const E2& e2) {
    //...
    }
     
    template <class E1, class E2>
    un_type2 operator+(const E1& e1, const hybrid_expression<E2>& e2) {
    //...
    }
    Code qui me sortait une erreur lorsque je tentais d'additionner deux hybrid_expression, me disant que trois operator+ correspondaient.

    En utilisant la mpl et en enlevant les deux derniers opérateurs du Set de surcharge lorsque les arguments dérivent de hybrid_expression, tout marche nickel :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    template <class E1, class E2>
    typename boost::disable_if<mpl::and_<boost::is_base_of<hybrid_expression<E1>, E1>,
                                         boost::is_base_of<hybrid_expression<E2>, E2>
                               un_type1>::type
        operator+(const hybrid_expression<E1>& e1, const E2& e2) {
            //...
        }
     
    //La meme chose pour operator+(const E1& e1, const hybrid_expression<E2>& e2)

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

Discussions similaires

  1. conversion implicite etrange
    Par maxmarie dans le forum VB.NET
    Réponses: 4
    Dernier message: 22/06/2007, 10h48
  2. [9i]Conversion implicite ?
    Par lunab54 dans le forum SQL
    Réponses: 7
    Dernier message: 19/04/2007, 14h49
  3. Réponses: 12
    Dernier message: 27/01/2007, 12h32
  4. [C#] Conversion implicite de type object vers int
    Par alexking2005 dans le forum C#
    Réponses: 5
    Dernier message: 02/01/2007, 10h02
  5. [jdbc][oracle] conversion implicite erronée
    Par Jack Huser dans le forum JDBC
    Réponses: 2
    Dernier message: 30/06/2005, 10h23

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