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 :

"no matching function for call" alors que je n'utilise pas cette fonction


Sujet :

Langage C++

  1. #1
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut "no matching function for call" alors que je n'utilise pas cette fonction
    Bonjour,

    Je n'ai pas l'habitude de demander de l'aide en pastant un gros bout de code, mais là, comme je ne sais absoluement pas d'où vient le problème, je me permet de le faire.

    Voici mon code, avec l'erreur en commentaire, sur la ligne concernée.
    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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    #include <Python.h>
    #include <iostream>
    #include <string>
    #include <vector>
    #include "python.h"
     
    using std::string;
    using std::istringstream;
    using namespace std;
     
     
     
    vector<string> get_binds()
    {
        vector<string> binds;
        binds.clear();
        binds.push_back("ACTION");
        binds.push_back("CONNECT");
        binds.push_back("CTCP");
        binds.push_back("JOIN");
        binds.push_back("KICK");
        binds.push_back("NICK");
        binds.push_back("NOTICE");
        binds.push_back("PART");
        binds.push_back("PING");
        binds.push_back("PRIVMSG");
        return binds;
    }
     
     
     
    class PythonLoader {
        public:
            PythonLoader() { // python.cpp:53: error: no matching function for call to ‘Serveur::Serveur()’
                Py_Initialize();
                signal(SIGINT, SIG_DFL);
                PyRun_SimpleString("__import__('sys').path.append('./modules/')");
            }
            ~PythonLoader() {
                Py_Finalize();
            }
            int load_module(const char* name) {
                PyObject *pModule;
                pModule = PyImport_ImportModule(name);
                if (pModule == NULL) {
                    cout << "Impossible de charger le module Python " << name << endl;
                    return -1;
                }
                else {
                    this->pModules.push_back(pModule);
                    this->idToName.push_back(name);
                    return 0;
                }
            } 
            int call_function(const char *mod_name, const char *func_name, PyObject *pArgs) {
                PyObject* pFunc;
                for (unsigned int i=0; i < this->idToName.size(); i++) {
                    if (this->idToName.at(i) == mod_name) {
                        pFunc = PyObject_GetAttrString(this->pModules.at(i), func_name);
                        if (pFunc && PyCallable_Check(pFunc)) {
                            PyObject_CallObject(pFunc, pArgs);
                            return 0;
                        }
                        else {
                            return 1;
                        }
                    }
                }
                return -1;
            }
            int set_current_Serveur(Serveur &serveur) {
                this->serveur = serveur;
                return 0;
            }
            Serveur get_current_Serveur() {
                return this->serveur;
            }
        private:
            vector<PyObject *> pModules;
            vector<string> idToName;
            Serveur serveur;
    };
    PythonLoader pythonLoader;
    J'utilise Linux et le compilateur G++. J'ai un Makefile pour réaliser mon make.

    Merci d'avance,
    ProgVal

    EDIT : Voici ce que me dit make :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    progval@ProgVal-Lucid:~/workspace/Tethys/modules/python$ make
    g++ -o python.o -c python.cpp -I . -W -Wall -Wmain -O3 -Wno-deprecated -fPIC -I/usr/include/python2.6 -I/usr/include/python2.6 -fno-strict-aliasing -DNDEBUG -g -fwrapv -O2 -Wall -O0 -g
    python.cpp: In constructor ‘PythonLoader::PythonLoader()’:
    python.cpp:53: error: no matching function for call to ‘Serveur::Serveur()’
    ../../src/lib/bot_api.h:136: note: candidates are: Serveur::Serveur(int, std::string, std::string, std::string, std::string, std::string, std::string)
    ../../src/lib/bot_api.h:134: note:                 Serveur::Serveur(const Serveur&)
    make: *** [python.o] Erreur 1

  2. #2
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Si tu l'appelles ... Mais implicitement (c'est pourquoi le ctor par défaut est appellé), et ce dans ton ctor évidemment puisque tu as :

    Serveur serveur;

    en attribut .
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  3. #3
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Ton serveur est un membre de ta classe, et comme ce n'est pas un pointeur, il sera forcément construit par défaut au début de l'appel du constructeur de ta classe, mais la tu n'as apparemment pas définit de constructeur par défaut.

    Donc soit tu en crée un, soit tu appelle spécifiquement le constructeur par paramètre de ton serveur.

    [edit]grillé :p [/edit]

  4. #4
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Merci à vous deux !

    Mais donc, comment puis-je faire pour ne pas l'initialiser ? J'ai essayé de dire que c'est un pointeur, mais après, g++ me râle dessus pour la fonction set_current_serveur
    (oui, je l'avoue, je suis très mauvais en C++)

  5. #5
    Membre chevronné
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 33
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Points : 2 205
    Points
    2 205
    Par défaut
    Donc soit tu en crée un, soit tu appelle spécifiquement le constructeur par paramètre de ton serveur.
    "Hardcoded types are to generic code what magic constants are to regular code." --A. Alexandrescu

  6. #6
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Le problème est que je ne veux pas en créer, car ce n'est pas le travail de mon bout de mon code (c'est un .so) de le faire.
    C'est le programme qui doit me passer ces objets.

  7. #7
    Membre confirmé
    Avatar de haraelendil
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Février 2004
    Messages
    283
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Février 2004
    Messages : 283
    Points : 533
    Points
    533
    Par défaut
    Bah dans ce cas la il faut utiliser un pointeur.
    Et dans ton set_current_server, il faut soit que tu utilise directement l'adresse du serveur qui t'es passé en paramètre (très dangereux et donc à éviter), soit tu crée un nouveau serveur en le copiant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int set_current_Serveur(Serveur &serveur) {
                this->serveur = new Serveur(serveur);
                return 0;
            }
    Il faut alors vérifier que le constructeur par copie de Serveur fait bien son boulot

  8. #8
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Citation Envoyé par haraelendil Voir le message
    Bah dans ce cas la il faut utiliser un pointeur.
    Et dans ton set_current_server, il faut soit que tu utilise directement l'adresse du serveur qui t'es passé en paramètre (très dangereux et donc à éviter), soit tu crée un nouveau serveur en le copiant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    int set_current_Serveur(Serveur &serveur) {
                this->serveur = new Serveur(serveur); // ATTENTION : LEAK POTENTIEL !
                return 0;
            }
    Il faut alors vérifier que le constructeur par copie de Serveur fait bien son boulot
    Version corrigée :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    int set_current_Serveur(Serveur &serveur) {
                if(this->serveur != NULL)
                        delete this->serveur;
                this->serveur = new Serveur(serveur); // plus de leak si on appelle deux fois de suite set_current_Serveur
                return 0;
            }
    Et il faut penser à faire la même chose dans le destructeur de la classe (ou le close_current_serveur s'il existe), ainsi qu'à initialiser à NULL dans le constructeur.

  9. #9
    Membre éclairé
    Avatar de ProgVal
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2006
    Messages
    636
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2006
    Messages : 636
    Points : 764
    Points
    764
    Par défaut
    Merci à vous.

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

Discussions similaires

  1. Réponses: 3
    Dernier message: 13/01/2012, 14h34
  2. Réponses: 2
    Dernier message: 05/08/2011, 18h13
  3. No matching function for call to 'Joueur::Joueur'
    Par Go'Gaule dans le forum Débuter
    Réponses: 4
    Dernier message: 02/07/2011, 07h50
  4. no matching function for call
    Par pimousse280187 dans le forum Linux
    Réponses: 1
    Dernier message: 06/06/2009, 21h08

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