[C++] Erreur link polymorphisme

gné

L’auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour à tous,

Je viens vers vous car j’ai un problème de link avec l’héritage, j’ai pu reproduire :

// a.h

template <typename T>
struct A
{
    virtual ~A();
    virtual void print( T const & ) = 0;
};

// a.cpp

#include "a.h"

template <typename T>
A<T>::~A() { }

// b.h

#include "a.h"

struct Bint
    : public A<int>
{
    void print( int const & );
        // ~Bint();
};

// b.cpp

#include "b.h"

#include <iostream>

void Bint::print( int const & i )
{
    std::cout << i << std::endl;
}

//Bint::~Bint() { }

// main.cpp

#include "b.h"

int main( int argc, char ** argv )
{
    Bint b;
    b.print( 1 );

    return 0;
}
Error   LNK2019 unresolved external symbol "public: virtual __thiscall A<int>::~A<int>(void)" (??1?$A@H@@UAE@XZ) referenced in function "public: virtual __thiscall Bint::~Bint(void)" (??1Bint@@UAE@XZ)

Error   LNK2001 unresolved external symbol "public: virtual __thiscall A<int>::~A<int>(void)" (??1?$A@H@@UAE@XZ)

J’ai essayé de définir le destructeur de Bint mais rien y fait… Je dois passer à côté d’un truc. Cependant, quand je déclare/défini tout dans le main.cpp je n’ai plus de problème.

Je compile avec VC140.

Merci d’avance pour votre aide.

nullptr

+0 -0
Auteur du sujet

J’ai trouvé la solution.

En fait comme la spécialisation est fait au moment de l’instanciation, le compilateur ne peut pas connaître le destructeur de A<>, provocant donc l’erreur de link. Il faut donc le rendre visible à l’inclusion, dans le .h directement ou dans un .inl inclus dans ce dernier.

@lmghs Oui merci ! Je n’avais pas assez réfléchis.

nullptr

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte