Error: no match for call to

razuki Messages postés 242 Date d'inscription lundi 17 décembre 2007 Statut Membre Dernière intervention 5 décembre 2012 - 4 avril 2011 à 18:02
cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 - 4 avril 2011 à 19:08
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 :
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 :
init( ... ){
 ...
 X509 *mycert;
 ...
 PEM_read_X509(fp, &mycert, 0, NULL);
 gMyCert(mycert);
 ...
}


Quand je compile ca me donne l'erreur suivante :
error: no match for call to &#8216;(isl::certificate<std::basic_string<char, std::char_traits<char>, std::allocator<char> > >) (X509*&)&#8217;


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 :
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
init( ){
X509 *mycert;
...
PEM_read_X509(fp, &mycert, 0, NULL)
...
certificate<string> gMyCert(mycert);
}


Merci d'avance pour votre aide.

1 réponse

cptpingu Messages postés 3837 Date d'inscription dimanche 12 décembre 2004 Statut Modérateur Dernière intervention 28 mars 2023 123
4 avril 2011 à 19:08
certificate<string> gMyCert; => certificate<string>* gMyCert;
Tu ne peux pas intialiser deux fois un objet.
"certificate<string> gMyCert;" équivaut à peu près à "certificate<string> gMyCert();" et construit donc l'objet avec le constructeur par défaut.

PS: Si tu as une variable globale, en C++, pose toi des questions sur la qualité de ton code.

________________________________________________________________________
Historique de mes créations, et quelques articles:
[ http://0217021.free.fr/portfolio http://0217021.free.fr/portfolio]
Merci d'utiliser Réponse acceptée si un post répond à votre question
0
Rejoignez-nous