Jump to content

[Résolu]C++: error LNK2019: unresolved external...


Dragohn

Recommended Posts

Bonjour,

Je me tourne vers vous car je cale complétement là. J'ai 3 fichiers:

  1. MaClasse.h: déclaration de ma classe et des variables/fonctions membres
  2. MaClasse.cpp: implémentation des fonctions membres de ma classe, je fais bien un #include "MaClasse.h" en début de fichier.
  3. Main.cpp: je fais un #include "MaClasse.h" et j'utilise MaClasse dans mon programme.

A la compilation tout est OK, mais à la construction de l'.exe, j'ai le droit à main.obj : error LNK2019: unresolved external symbol "fonction" et ce pour chaque fonction de MaClasse que j'appelle dans le main.

Je sais que ca signifie qu'au moment de la construction, le compilo ne trouve pas la référence à la fonction indiquée. Ce que je ne comprends pas, c'est pourquoi il ne trouve pas, alors que je fais bien un include du .h dans le Main.cpp. Là où je je comprends encore moins, c'est qu'avec une autre classe ça marche très bien! :pleure:

Si quelqu'un pouvait m'éclairer :up:

Link to comment
Share on other sites

Par le plus grand des hasards, utiliserais-tu code::blocks et le compilateur borland ??

je viens d'avoir et de résoudre le même prob

en ajoutant manuellement mes librairies dans :

build--> compiler option

Puis dans l'onglet : linker

Tu fais "add" et tu recherches le repertoire contenant les .lib

Tu les ajoutes toutes... et voilou...

Link to comment
Share on other sites

Non, j'ai testé sous Visual C++6, 2005 et DevCPP4, et à chaque fois le même problème :D

Pour information je vous met le code, pour montrer que vraiment il n'y a rien de particulier:

  1. CElement.h
    #ifndef __CELEMENT_H__
    #define __CELEMENT_H__
    
    template <class T>
    class CElement
    {
    private:
    T Element;
    CElement<T> *pNext;
    
    public:
    CElement(void);
    CElement(T);
    
    // Accesseurs
    T getElement() const;
    CElement<T> *getNext() const;
    
    //Mutateurs
    void setElement(const T);
    void setNext(CElement<T>);
    };
    #endif


  2. CElement.cpp
    #include "CElement.h"
    #include <iostream>
    
    template <class T>
    CElement<T>::CElement(T elt):Element(elt), pNext(NULL)
    {
    }
    
    template <class T>
    CElement<T>::CElement():pNext(NULL)
    {
    }
    
    
    template <class T>
    T CElement<T>::getElement() const
    {
    return Element;
    }
    
    template <class T>
    CElement<T> *CElement<T>::getNext() const
    {
    return pNext;
    }
    
    template <class T>
    void CElement<T>::setElement(const T elt)
    {
    Element = elt;
    }
    
    template <class T>
    void CElement<T>::setNext(CElement<T> next)
    {
    pNext = next;
    }


  3. Main.cpp
    #include "CElement.h"
    #include <iostream>
    
    int main(void){
      CElement<int> Tmp;
      Tmp.setElement(20);
      std::cout<<Tmp.getElement()<<"Ok";
    }


Voilà, vous voyez je ne fais pas d'appel à quoi que soit d'extérieur de particulier, c'est juste une bête classe finalement. Je ne comprends donc vraiment pas l'erreur renvoyé.

Edit: Ayant remarqué que seules mes classes comportant des template posaient problème, j'ai cherché de ce côté. Je viens de m'apercevoir que j'avais oublié que les template ne pouvaient pas être séparés en .h et .cpp mais que la déclaration + l'implémentation devaient se trouver ensemble dans le fichier d'en tête.

Désolé pour cette erreur stupide! Merci pour le coup de main tout de même ;)

Link to comment
Share on other sites

Archived

This topic is now archived and is closed to further replies.

×
×
  • Create New...