|
|
|
|
Bonjour,
J'ai un soucis qui me prend la tête depuis quelques temps.
En fait je n'arrive pas à utiliser ma classe "Copy"
Mon main.cpp:
#include <iostream>
#include "ClassCopy.hpp"
#include "ClassFileObj.hpp"
using namespace std;
int main(int argc, char *argv[])
{
const char* test;
test = "blabla";
Copy copie(test,test);
return 0;
}
#include <iostream>
#include <signal.h>
#include <sys/types.h>
#include <sys/wait.h>
#include <sys/stat.h>
#include <fcntl.h>
#include "ClassCopy.hpp"
using namespace std;
//construct
Copy::Copy(const char *pth_source, const char *pth_target, bool preserveAttr = false)
{
source = new FileObj(pth_source); //FileObj est une autre classe
target = new FileObj(pth_target);
preserve = preserveAttr;
}
Configuration: Linux Firefox 3.0.4
Il est normal que la simple déclaration "Copy *copie;" ne provoque pas d'erreur puisqu'il n'est pas fait appel au constructeur; ce qui signifie que l'erreur se passe sans doute dans le constructeur.
|
Houlà, les mecs, vous faites du hors sujet.
main.cpp: In function «void copier(GtkWidget*, void*)»: main.cpp:12: erreur: initializer liste d'expressions traitée comme une expression composée main.cpp:12: erreur: cannot convert «const char*» to «Copy*» in initializationIl dit que l'erreur vient de la fonction copier(), or je ne la voi pas dans le code source fourni. Message suivant. main.cpp:476: erreur: no matching function for call to «Copy::Copy(const char*&, const char*&)» ClassCopy.hpp:8: note: candidats sont: Copy::Copy(const char*, const char*, bool) ClassCopy.hpp:5: note: Copy::Copy(const Copy&) main.cpp:477: erreur: no matching function for call to «Copy::start()» ClassCopy.hpp:9: note: candidats sont: void Copy::start(bool)le "note:" te liste juste les constructeurs qu'il pourrai utiliser en te disant qu'il ne sont pas bon. Il trouve juste ton constructeur et le constructeur de copie par défaut. Comme pour start, le compilo te dit qu'il ne trouve pas la fonction start(void) mais start(bool), ça te permet de corriger ton appel de fonction. Je ne suis pas daccord avec Droopy sur le constructeur, si le troisième a une valeur par défaut c'est bien pour appeler le constructeur en en omettant un. Il faut juste faire attention à ne pas créer d'ambiguité par exemple Classe(int i,bool j=true) et Classe(int i) lors d'un appel à Classe(3) le compilateur ne sais pas quel constructeur appeler. Sinon, pour moi le message du compilateur n'a rien à voir avec le code source. Aurait tu oublié une accolade dans un entête ? Salutation ! Char Snipeur |
Compilation échouée. /tmp/cctqIvpY.o: In function `copier(_GtkWidget*, void*)': main.cpp:(.text+0x86): undefined reference to `Copy::Copy(char const*, char const*, bool)' main.cpp:(.text+0x91): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution PS:Mon pseudo a changer car je me suis inscrit |
Certes, le code source aurait été trop long, mais le compilateur indique une erreur dans la fonction "copier(GTK...)" que nous ne voyons pas, pourquoi une erreur dans cette fonction si tu es dans le main() ? L'expérience m'a appris qu'il vaut mieux traité en premier la première erreur du compilateur. il faut se concentrer sur cette fonction "copier()" d'où vient elle, à quoi sert elle ?
|
Effectivement je n'avais pas pensé à ça. donc après essais :
g++: -lgtk-x11-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgdk-x11-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -latk-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgdk_pixbuf-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lm: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lpangocairo-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lpango-1.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lcairo: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgobject-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lgmodule-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -ldl: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite g++: -lglib-2.0: fichier d'entrée d'édition de liens n'est pas utilisé parce l'édition de lien n'a pas été faite Compilation terminée avec succès. cas de la construction avec le booléen: /tmp/cc4GT3Jz.o: In function `main': test.cpp:(.text+0x1b2): undefined reference to `Copy::Copy(char const*, char const*, bool)' test.cpp:(.text+0x1c2): undefined reference to `Copy::~Copy()' collect2: ld a retourné 1 code d'état d'exécution Compilation échouée. Et sans le booléen rien a changé. Voila mes ligne de compilation et construction peut-être que ça viens de là (il y a du GTK dans le code complet) compilation : g++ `pkg-config --libs --cflags gtk+-2.0` -c "%f" construction : g++ `pkg-config --libs --cflags gtk+-2.0` -o "%e" "%f" %f nom du fichier avec extension %e nom du fichier sans extension |
Je me doutai que c'était un problème de compilation, que tu oubliait de lier.
|
Moi, je ne comprends pas comment ça pouvait marché sans les .o. Si tu ne lui fourni pas l'implémentation des constructeurs, il n'y a pas de raison que ça fonctionne.
|