2010-05-01 4 views
7

J'ai deux classes, l'une héritée de l'autre. Quand je compile, je reçois les erreurs suivantes:Erreur C++ LNK2019 avec les constructeurs et les destructeurs dans les classes dérivées

Entity.obj: erreur LNK2019: symbole externe non résolu "public: __thiscall Utility :: Parsables :: Base :: Base (void)" (?? 0Base @ Parsables @ Utility @@ QAE @ XZ) référencé dans la fonction "public: __thiscall Utilitaire :: Parsables :: Entity :: Entity (void)" (?? 0Entity @ Parsables @ Utilitaire @@ QAE @ XZ)

Entity.obj : erreur LNK2019: symbole externe non résolu "public: utilitaire __thiscall virtuel :: Parsables :: Base :: ~ Base (void)" (?? 1Base @ Parsables @ Utility @@ UAE @ XZ) référencé dans la fonction "public: virtual __thiscall Utility :: Parsables :: Entity :: ~ Entity (void) "(?? 1Entity @ Parsables @ Utilitaire @@ UAE @ XZ)

D: \ Programmation Projets \ \ Caféine \ Debug \ Caffeine.exe: LNK1120 erreur fatale: 2

non résolus externals

Je ne peux pas comprendre ce qui se passe .. peut-on voir ce que je fais faux? J'utilise Visual C++ express 2008. Voici les fichiers ..

"include/Utilitaire/Parsables/Base.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_BASE_HPP 
#define CAFFEINE_UTILITY_PARSABLES_BASE_HPP 

namespace Utility 
{ 
namespace Parsables 
{ 
    class Base 
    { 
    public: 
    Base(void); 
    virtual ~Base(void); 
    }; 
} 
} 

#endif //CAFFEINE_UTILITY_PARSABLES_BASE_HPP 

« src/Utilitaire/Parsables/Base.cpp "

#include "Utility/Parsables/Base.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    Base::Base(void) 
    { 
    } 

    Base::~Base(void) 
    { 
    } 
} 
} 

"include/Utilitaire/Parsables/Entity.hpp"

#ifndef CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 
#define CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 

#include "Utility/Parsables/Base.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    class Entity : public Base 
    { 
    public: 
    Entity(void); 
    virtual ~Entity(void); 
    }; 
} 
} 

#endif //CAFFEINE_UTILITY_PARSABLES_ENTITY_HPP 

"src/Utilitaire/Parsables/Entity.cpp"

#include "Utility/Parsables/Entity.hpp" 

namespace Utility 
{ 
namespace Parsables 
{ 
    Entity::Entity(void) 
    { 
    } 

    Entity::~Entity(void) 
    { 
    } 
} 
} 
+0

Tous ces fichiers sont-ils inclus dans le projet? Les voyez-vous compiler? – shoosh

+0

Oui, ils sont tous inclus et compilent bien. – BLH

+0

essayer de se débarrasser des espaces de noms – shoosh

Répondre

8

Le bit correspondant est le suivant:

unresolved external symbol "public: __thiscall Utility::Parsables::Base::Base(void)" 

Vous devez fournir une définition pour Base::Base et Base::~Base. Une déclaration n'est pas assez bonne. Même si vous n'avez rien à faire dans les deux fonctions, vous devez laisser un corps de fonction vide, car C++ requiert réellement l'existence de la fonction. C++ met des choses comme la maintenance de la table virtuelle à l'intérieur de vos constructeurs et destructeurs, donc ils doivent être définis même si vous n'avez rien à faire là-bas - C++ doit faire des choses là-dedans.

Etes-vous sûr que Base.cpp est inclus dans la construction?

+0

Mes fichiers sources contiennent des définitions, j'ai laissé un corps de fonction vide comme vous l'avez décrit. – BLH

+0

@BLH: lire ma dernière phrase :) (j'edited la réponse même si elle ne semble pas de cette façon) –

+0

Je viens de vérifier et rappeler quelque chose, j'ai deux fichiers tous les deux nommés Base.cpp, mais ils sont dans des répertoires différents . Je vois une compilation, mais pas deux. Est-ce que cela pourrait être le problème? – BLH

0

Soit votre base.cpp n'est pas compilé/lié ou vous avez mal orthographié dans ce

0

Juste rencontré ce même erreur aujourd'hui exacte dans Visual Studio 2015. Malheureusement, la réponse n'a pas accepté travaillé (ainsi que réponses de plusieurs questions identiques). La chose qui a fonctionné pour moi était un clic droit sur le fichier cpp de la classe de base, exclure, puis l'inclure à nouveau. Je pense que VS est devenu confus tout en déplaçant le fichier et renomme et il a refusé de le compiler en silence, même s'il était marqué "Inclus dans le projet" = vrai dans l'éditeur de propriété et listé dans le fichier vcproj dans le groupe. C'est une erreur horrible et a fini par passer une bonne heure là-dessus.

Questions connexes