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 :

Passage d'argument par référence : no instance of overloaded function matches the argument list


Sujet :

Langage C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut Passage d'argument par référence : no instance of overloaded function matches the argument list
    Bonjour à tous !

    Je tente d'appeler une méthode que j'ai déjà réussi à appeler en amont, mais cette fois-ci les types ne correspondent pas à ceux attendus. Je pense que le souci vient de la conversion en références mais la méthode à suivre m'échappe. Impossible de compiler.
    Voici les codes:

    Prototype de la méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
     
    /*!
                    *  \brief Lecture du fichier de config
                    *
                    *  Lecture d'un élément spécifique de type string du fichier de config sous traité par _read de ParamsIni
                    *
                    *       \param [IN] aip_section : section du paramètre recherché
                    *       \param [IN] aipname : nom du paramètre recherché
                    *   \param [IN] aipname : Valeur par défaut à donner à ao_value en cas d'échec
                    *       \param [OUT] ao_value : valeur string du paramètre
                    *  \return bool : flag de réussite
                    *
                    */
    		__declspec(dllimport) bool read(const string& ai_section, const string& ai_name, string& ao_value, const string& ai_defaultValue = "");
    maintenant, un premier appel de ma méthode qui fonctionne très bien
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Params* Factory::buildParameters(const string& aip_configPath, string &aiop_model)
    {
              mp_param = new ParamsIni(aip_configPath);//ça c'est ok, pas de souci
              mp_param->read("MODEL", "ModelView", aiop_model, "default");//ça marche
    }
    Mais dans une autre classe, j'appelle ma méthode comme suit et les arguments n'ont pas les bons types !
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    View::View(const Params* aip_params)
    {
            string* wp_model= new string("");
    	string &w_model = *wp_model;//je sais que c'est bizarre, mais c'est ma dernière tentative en date.
     
    	aip_params->read(Constant::PARAM_SECTION_MODEL, Constant::PARAM_VALUE_MODEL, w_model, Constant::MODEL_DEFAULT);
    }
    A noter que toutes les constantes sont des static const std::string de la classe constante. Comment je peux les transformer en références ? Pourquoi si je choisis d'écrire "MODEL" en dur comme précédemment ça me le prend comme une char[6] et non pas comme une std::string::basic_string comme précédemment ? Tout ça m'échappe un peu...

    Help !

  2. #2
    Membre chevronné
    Profil pro
    Inscrit en
    Mars 2010
    Messages
    309
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2010
    Messages : 309
    Par défaut
    *aip_params est const mais Params::read n'est pas const.

    Quel est le message d'erreur complet? Un compilo raisonnable te dira que le problème vient du const très clairement.

  3. #3
    Membre Expert
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2011
    Messages
    760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Hérault (Languedoc Roussillon)

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

    Informations forums :
    Inscription : Juin 2011
    Messages : 760
    Par défaut
    Petite note, Il n'existe pas de conversion en référence, toutes les valeurs sont des références. Soit des rvalues références (T&&) pour les temporaires, soit des lvalues références (T&) pour les variables. Et les lvalue constante acceptent tous les types de référence. Donc pour des T const&, seul le type importe et peut amener à des conversions s'il ne correspond pas. Après il y a quelques particularités, mais ce n'est pas bien important.

    Quel est le prototype de Params::read() ? Parce que là tu nous montres ParamsIni::read.

    Le compilateur donne plus d'information, comme la liste des fonctions disponibles, et pour certains quels paramètres ne correspondent pas. Lorsque tu donnes une erreur de compilation, donne toute l'erreur, ce sera plus simple pour ceux qui aident.

  4. #4
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut
    Merci beaucoup pour ta réponse !
    Citation Envoyé par jo_link_noir Voir le message
    Quel est le prototype de Params::read() ? Parce que là tu nous montres ParamsIni::read.
    C'est vrai que j'ai oubli" de le préciser. ParamsIni et Params ont les mêmes prototypes. ParamsIni est juste une base abstraite parent de Params.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut
    Citation Envoyé par TropMDR Voir le message
    Quel est le message d'erreur complet? Un compilo raisonnable te dira que le problème vient du const très clairement.
    L'erreur du compilo :
    error C2663: 'Params::read': 2 overloads have no legal conversion for 'this' pointer
    2>Done building project "LIB_VIEW.vcxproj" -- FAILED.
    et l'erreur écrite directement lorsqu'on la survole :
    read

    no instance of overloaded function "Params::read" matches the argument list and object (the object has type qualifiers that prevent a match)
    argument types are (const std::string, const std::string, std::string, const std::string)
    object type is: const params

  6. #6
    Expert confirmé
    Homme Profil pro
    Ingénieur développement matériel électronique
    Inscrit en
    Décembre 2015
    Messages
    1 599
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 62
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur développement matériel électronique
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Décembre 2015
    Messages : 1 599
    Par défaut
    C'est vrai que le message du compilateur n'est pas clair.
    Mais on y voit 'no legal conversion for 'this' pointer' et plus loin on voit que l'objet est un 'const params'. Il n'écrit pas pas clairement que la fonction n'est pas déclarée const pour l'objet.

    La méthode est __declspec(dllimport) bool read(const string& ai_section, const string& ai_name, string& ao_value, const string& ai_defaultValue = ""); elle n'est pas déclarée const pour l'objet. Il faudrait que ce soit : __declspec(dllimport) bool read(const string& ai_section, const string& ai_name, string& ao_value, const string& ai_defaultValue = "") const;

  7. #7
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Avril 2019
    Messages
    8
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 28
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : Industrie

    Informations forums :
    Inscription : Avril 2019
    Messages : 8
    Par défaut
    Je vois, merci beaucoup !
    Citation Envoyé par dalfab Voir le message
    La méthode est __declspec(dllimport) bool read(const string& ai_section, const string& ai_name, string& ao_value, const string& ai_defaultValue = ""); elle n'est pas déclarée const pour l'objet. Il faudrait que ce soit : __declspec(dllimport) bool read(const string& ai_section, const string& ai_name, string& ao_value, const string& ai_defaultValue = "") const;
    effectivement, si je déclare la méthode constante, l'erreur disparait. Le souci, c'est que ce code est très générique, et que je ne suis pas trop sensé changer ces méthodes que j'ai d'ailleurs récupérées d'un autre projet. Ça me prendrait au moins une journée pour tout changer partout.
    Au final, je me débrouille bien en appelant cette méthode dans Factory, comme dans mon post initial, le bout de code qui fonctionne bien.Mais pourquoi lorsque j'appelle read dans Factory, ça marche, mais plus lorsque je l'appelle dans View ? La méthode n'est pas const, là non plus. Quelle est la différence ?

  8. #8
    Modérateur

    Avatar de Bktero
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2009
    Messages
    4 493
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

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

    Informations forums :
    Inscription : Juin 2009
    Messages : 4 493
    Billets dans le blog
    1
    Par défaut
    Ton objet sur lequel tu appelles la méthode doit être const d'un côté (et le compilateur râle) et pas de l'autre côté (le compilateur est content).

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

Discussions similaires

  1. Passage de classes par références ?
    Par octal dans le forum Langage
    Réponses: 3
    Dernier message: 18/01/2007, 16h05
  2. [POO] Passage de paramètre par référence.
    Par abidi_niz dans le forum Langage
    Réponses: 3
    Dernier message: 12/10/2006, 12h20
  3. [C#] passage de paramètres par référence
    Par SesechXP dans le forum Windows Forms
    Réponses: 3
    Dernier message: 03/08/2006, 12h48
  4. [EJB] Passage des paramètres par référence
    Par salome dans le forum Java EE
    Réponses: 2
    Dernier message: 05/07/2005, 11h25
  5. Réponses: 3
    Dernier message: 19/05/2005, 10h46

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