2010-11-26 29 views
0

Eh bien, c'est vraiment étrange ce qui m'arrive, mais je vais essayer de le rendre clair. J'ai une classe et dans une méthode je décide de mettre un lancer (dans la définition de hpp et dans l'implémentation de cpp). donc j'ai ma méthode qui peut lancer une exception std :: exception. Ici pas de problème.C++ Linker échoue parce que j'ajoute un jet

je crée une exception à moi:

class MyException : public std::exception { 
public: 
    MyException() throw(); 
    ~MyException() throw(); 
    const char what() const throw(); 
} 

ok, nous allons l'utiliser dans mes méthodes de:

class myclass { 
    void mymethod() throw(std::exception); 
} 

Pour:

class myclass { 
    void mymethod() throw(MyException); // I have included hpp file where MyException is defined 
} 

OK! ce que je reçois

/tmp/ccwSS5GE.o:(.gcc_except_table+0x84): référence non définie à 'typeinfo pour MyException' collect2: ld retourné 1 état de sortie

POURQUOI?? Avec std :: exception tout fonctionne bien, maintenant rien ne fonctionne bien.

+2

[Ce fil devrait aider] (http: //stackoverflow.com/questions/307352/g-undefined-reference-to-typeinfo). Vérifiez spécifiquement [la réponse de Tyler McHenry] (http://stackoverflow.com/questions/307352/g-undefined-reference-to-typeinfo/307440#307440) - si vous ne pouvez toujours pas le résoudre, veuillez nous montrer tout votre code et comment vous essayez de l'utiliser. – birryree

+5

L'éditeur de liens ne s'est pas écrasé. Il a simplement signalé une erreur dans votre programme. –

+1

L'ordre de liaison joue le rôle dans unix. essayer ça? – Muggen

Répondre

2

Je pense que le code OP devrait donner une erreur de compilation car il est mal formé et pas dans la zone de UB (ce qui peut expliquer l'erreur de l'éditeur de liens qui est surprenant ici).

Je suppose que le problème est votre déclaration.

const char what() const throw(); 

Le type de retour 'const char' dans votre classe est covariante pas avec celui de la classe de base std :: exception qui est définie comme

virtual const char* std::exception::what() const throw() 
+0

Eh bien, merci pour votre suggestion. Je suis désolé j'ai mal tapé ce char qui est un char * !! Eh bien, à la fin je pourrais le résoudre, mais c'est étrange, je n'ai pas créé un fichier cpp avec des implémentations pour ces méthodes, peut-être que le compilateur devenait vraiment fou parce que quand il rencontrait le lancer type, il n'a pas trouvé une bonne mise en œuvre et est devenu fou. Pensez-vous que c'est une bonne explication? – Andry