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 :

surcharge et déduction template


Sujet :

Langage C++

  1. #1
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut surcharge et déduction template
    Bonjour,
    je n'arrive pas pouvoir détecter le paramètre d'une fonction membre surchargée (version non const et version const) erreur C2914 ; je suis sous VS 2005 :
    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
    struct TTest
    {
        string txt;
     
        const string & get_txt() const
        { return txt; }
     
        string & get_txt()
        { return txt; }
    };
     
    template<typename TReturn>
    void tmp_funct(TReturn (TTest::* )() const)
    { //...
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        tmp_funct( &TTest::get_txt ); // erreur C2914
        //...
    }
    Si il est logique d'avoir cette erreur pour
    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
    struct TTest
    {
        int f(int)
        { /* ... */ }
     
        string f(const char *)
        { /* ... */ }
    };
     
    template<typename TResult, typename T>
    void tmp_funct(TResult (TTest::* )(T) )
    { //...
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        tmp_funct( &TTest::f ); // quel TTest::f prendre ? => erreur C2914
        //...
    }
    elle n'as pas lieu avec
    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
    struct TTest
    {
        int f(int)
        { /* ... */ }
     
        string f(const char *)
        { /* ... */ }
    };
     
    template<typename TResult>
    void tmp_funct(TResult (TTest::* )(int) )
    { //...
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
        tmp_funct( &TTest::f ); // Ok
        //...
    }
    Or dans le cas qui m'intéresse, la version const est bien demandée. Est-ce un restriction (bug?) du compilateur ou du langage ?

  2. #2
    Membre confirmé Avatar de Lavock
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    560
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 560
    Points : 633
    Points
    633
    Par défaut
    Mis à par le fait que j'ai dis que de la m****, ton premier code compile sous gcc 4.4 (mingw). Je suppose donc que c'est VS.
    The mark of the immature man is that he wants to die nobly for a cause, while the mark of the mature man is that he wants to live humbly for one.
    --Wilhelm Stekel

  3. #3
    Membre confirmé
    Avatar de gb_68
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Août 2006
    Messages
    232
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Haut Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2006
    Messages : 232
    Points : 546
    Points
    546
    Par défaut
    Merci pour ta réponse.
    Je viens de tester sous VS 2008 Express, même sanction ; cela doit être propre à VS .
    Pourtant ce genre de code passe :
    (par analogie
    • string & get_txt() -> static string & st_get_txt(TTest * This) )
    • const string & get_txt() const -> static const string & st_get_txt(const TTest * This)
    )
    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
    23
    24
    25
    26
    27
    struct TTest
    {
        string txt;
     
        const string & get_txt() const
        { return txt; }
     
        string & get_txt()
        { return txt; }
     
        static const string & st_get_txt(const TTest * This) 
        { return txt; }
     
        static string & st_get_txt(TTest * This)
        { return txt; }
    };
     
    template<typename TReturn>
    void tmp_funct(TReturn (*)(const TTest *) )
    { //...
    }
     
    int _tmain(int argc, _TCHAR* argv[])
    {
    	tmp_funct( &TTest::st_get_txt ); // Ok, version const
            //...
    }

Discussions similaires

  1. Déduction template mystérieuse
    Par oodini dans le forum Langage
    Réponses: 4
    Dernier message: 04/06/2013, 02h27
  2. surcharge d'un template en C++
    Par foulques.nera dans le forum C++
    Réponses: 6
    Dernier message: 22/10/2012, 16h27
  3. Réponses: 5
    Dernier message: 06/09/2012, 07h44
  4. Surcharge de fonction template
    Par camboui dans le forum C++
    Réponses: 3
    Dernier message: 09/05/2011, 11h25
  5. [Template] Surcharge spécialisé de Template
    Par Snark dans le forum Langage
    Réponses: 4
    Dernier message: 06/09/2007, 15h22

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