"undefined refernce to vtable"

Re: "undefined refernce to vtable"

by Jean-Cédric Chappelier -
Number of replies: 0

Cette erreur indique en effet qu'une méthode virtuelle n'est pas trouvée (= pas définie) lors de l'édition de liens (« linker »).
La raison de cette absence de définition peut avoir une origine diverse :

  1. vous « linker » avec un .o trop ancien qui n'a pas été remis à jour ;
    explication : la méthode en question n'était pas virtuelle au départ, mais transformée en virtuelle ensuite, mais le .cc correspondant n'a jamais été recompilé et donc le .o contient toujours la version non virtuelle
    tests facile :
    rm *.o
    avant de recompiler
    correction : corriger le Makefile pour que toutes les dépendances (en particulier aux bons .h) soient correctes ; du coup toute modifications d'un .h concerné (typiquement celui où l'on a mit le virtual ;-) ) engendrera la recompilation du .cc concerné.

  2. vous n'avez effectivement pas défini la méthode virtuelle en question (ce qui est pénible c'est que l'on ne sait pas laquelle c'est :-( ) ;
    typiquement :
    1. vous avez mis un destructeur virtuel mais ne l'avez pas défini ;
      exemple :
      virtual ~A();

      au lieu de
      virtual ~A() {}

      ou
      virtual ~A() = default;

       
    2. vous avez fait une faute de frappe entre le prototype et la définition ;
      exemple :
      dans le .h :
      virtual double un_nom_complique_difficile_a_lire(A avec, B plein, C d, D arguments);

      dans le .cc :
      virtual double un_non_complique_difficile_a_lire(A avec, B plein, C d, D arguments) { ... }

      vous avez vu la faute ? (n au lieu de m)

    3. oubli d'un
      const
      dans la définition ;
      exemple :
      dans le .h :
      virtual double f() const;

      dans le .cc :
      virtual double f() { ... }
       

    4. vous avez vraiment (simplement) oublié de définir une méthode virtuelle ;

    5. vous avez oublié de mettre le .o correspondant dans l'édition de liens : c'est presque pareil que le point 1.
Bonne quête !