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 :

error: no match for call to


Sujet :

C++

  1. #1
    Membre actif
    Profil pro
    Étudiant
    Inscrit en
    Décembre 2007
    Messages
    630
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Décembre 2007
    Messages : 630
    Points : 234
    Points
    234
    Par défaut error: no match for call to
    Bonjour,
    j'aimerais savoir comment je peux initialiser une structure ( en dehors de la déclaration ) :
    En effet, je déclare d'abord la structure en faisant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    certificate<string> gMyCert;
    Cet objet certificat est accessible depuis n'importe quelle fonction de mon_fic.cpp
    puis j'aimerais l'initialiser dans une fonction qui se trouve toujours dans mon_fic.cpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    init( ... ){
     ...
     X509 *mycert;
     ...
     PEM_read_X509(fp, &mycert, 0, NULL);
     gMyCert(mycert);
     ...
    }
    Quand je compile ca me donne l'erreur suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    error: no match for call to ‘(isl::certificate<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (X509*&)
    Je ne comprend pas ce qui se passe. Il me dit no match for call alors que j'ai bien un constructeur certificate(X509* cert). Voici la définition de ma structure certificate :
    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
     
    template<class StrType> struct certificate : shared {
     
       StrType  uri;
       StrType  sn;
       StrType  data;
     
     
      bool invalid() const { return (uri.empty() || sn.empty() || data.empty()); } 
      bool valid() const { return !invalid(); }
      certificate() {}
     
     
       certificate(X509* cert){
         // retrieve data
         unsigned char *u_out;
         u_out = NULL;
         size_t certlen;
         certlen = i2d_X509(cert, &u_out); 
         char *out = reinterpret_cast<char *>(u_out);
         data = out;
     
         // retrieve uri <=> common name
         X509 *mycert = cert;
         char commonName[512];
         X509_NAME * name = X509_get_subject_name(mycert);
         X509_NAME_get_text_by_NID(name, NID_commonName, commonName, 512);
         uri = commonName;
     
         // retrieve sn
         char serialNumber[512];
         X509_NAME_get_text_by_NID(name, NID_serialNumber, serialNumber, 512);
         sn = serialNumber;
       }
     
       certificate(const certificate& other) : uri(other.uri), sn(other.sn), data(other.data) { }
     
     };

    Ce qui m'étonne c'est que ca compile quand je déclare la structure dans la fonction init( ) ... c'est à dire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    init( ){
    X509 *mycert;
    ...
    PEM_read_X509(fp, &mycert, 0, NULL)
    ...
    certificate<string> gMyCert(mycert);
    }
    Merci d'avance pour votre aide.

  2. #2
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 266
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 266
    Points : 6 688
    Points
    6 688
    Billets dans le blog
    2
    Par défaut
    Bonjour,

    la ligne:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    certificate<string> gMyCert;
    construit l'objet gMyCert. Dans ce cas c'est le constructeur par défaut qui est appelé.
    Et lorsque tu fais étant donné que gMyCert est déjà construit, le compilateur croit que tu cherche à appeler une fonction gMyCert qui prendrait un X509 * en paramètre.

    Si tu ne souhaites pas initialiser ton objet lors de la création, il faut que tu créé une fonction membre dédiée (dont le nom sera explicite si possible). Typiquement une fonction: bool init( /*paramètres*/ ); (c'est la signature "old-school" d'un init: renvoie false si un problème est survenu. Aujour'hui on préfèrera souvent gérer cela avec les exceptions).

Discussions similaires

  1. error: no matching function for call to 'survingt'
    Par casse_noix dans le forum C++
    Réponses: 11
    Dernier message: 08/04/2015, 16h54
  2. Réponses: 3
    Dernier message: 13/01/2012, 15h34
  3. error: no match for 'operator='
    Par MastahPommeh dans le forum Débuter
    Réponses: 6
    Dernier message: 06/04/2011, 18h22
  4. no matching function for call
    Par pimousse280187 dans le forum Linux
    Réponses: 1
    Dernier message: 06/06/2009, 22h08

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