2009-10-19 10 views
0

Lier mon programme génère un tas d'erreurs comme ci-dessous.Classes de modèles et leurs méthodes

/home/starlon/Projects/LCDControl/DrvQt.cpp:8: undefined reference to `Generic<LCDText>::Generic(Json::Value*, int)' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:18: undefined reference to `Generic<LCDText>::~Generic()' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:8: undefined reference to `Generic<LCDText>::Generic(Json::Value*, int)' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:18: undefined reference to `Generic<LCDText>::~Generic()' 
DrvQt.o: In function `~DrvQt': 
/home/starlon/Projects/LCDControl/DrvQt.cpp:23: undefined reference to `Generic<LCDText>::~Generic()' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:23: undefined reference to `Generic<LCDText>::~Generic()' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:23: undefined reference to `Generic<LCDText>::~Generic()' 
/home/starlon/Projects/LCDControl/DrvQt.cpp:23: undefined reference to `Generic<LCDText>::~Generic()' 
DrvQt.o:(.rodata._ZTV5DrvQt[vtable for DrvQt]+0xc): undefined reference to `Generic<LCDText>::CFG_Key()' 
DrvQt.o:(.rodata._ZTC5DrvQt0_7GenericI7LCDTextE[vtable for DrvQt]+0xc): undefined reference to `Generic<LCDText>::CFG_Key()' 

Est-ce que cela signifie que je dois avoir un générique :: MethodName (et générique :: MethodName) pour chaque paramètre modèle que je vais utiliser? J'espère que non. J'avais l'impression que les gabarits étaient censés éviter ce genre de scénario.

Edit: Voici DrvQt.cpp

#include <iostream> 
#include <QMainWindow> 
#include "LCDControl.h" 
#include "DrvQt.h" 

DrvQt::DrvQt(LCDControl *visitor, Json::Value *config, int rows, int cols) : 
    Generic<LCDText>(config, LCD_TEXT) { // line 8 
    display_ = new QtDisplay((Generic<LCDText> *)this, 
     config, rows, cols, 8, 6); 
    lcd_ = (LCDText *)display_; 
    std::cout << "DrvQt" << std::endl; 
    visitor_ = visitor; 
    std::cout << "Eval: " << Eval("uptime.Uptime('%H')").toString().toStdString() << std::endl; 
    std::cout << "Eval: " << Eval("cpuinfo.Cpuinfo('model name')").toString().toStdString() << std::endl; 
    std::cout << "Eval: " << Eval("foo").toString().toStdString() << std::endl; 
    std::cout << "Eval: " << Eval("name").toString().toStdString() << std::endl; 
} // line 18 

DrvQt::~DrvQt() { 
    delete display_; 
    //delete window; 
} // line 23 
+0

Eh bien, il est supposé être LCDText et LCDGraphic après Generic, entouré par shift-, et shift-., Dans ce dernier paragraphe. – Scott

+0

Voici la question connexe de plus tôt ... http://stackoverflow.com/questions/1590688/class-is-not-a-template-type – razlebe

+0

Merci sgreeve. J'ai presque édité cette question, mais j'ai pensé que celui-ci était trop indépendant. – Scott

Répondre

4

plus de code pour debug serait bien, s'il vous plaît un peu de code que le message de débogage ne suffit pas d'aller avec (pour moi atleast). Pour l'instant, cela ressemble à une référence non définie. Vous pouvez donc vous assurer que la déclaration et l'implémentation de la classe de modèle se trouvent dans le même fichier. Pas séparé en .hpp et .cpp comme d'habitude. C'est une lacune des classes de modèles (ce qui est logique une fois que vous comprenez comment ils fonctionnent).

Editer: Comment êtes-vous censé utiliser les classes de modèles dans d'autres fichiers?

Je veux dire si vous avez (dans un projet normal):

someclass.hpp 
someclass.cpp 
main.cpp 

Et puis vous faites UneClasse une classe de modèle, vous devez fusionner tous la mise en œuvre de UneClasse dans son fichier d'en-tête de sorte qu'il serait maintenant être:

someclass.hpp 
main.cpp 

dans les deux cas, vous pouvez toujours avoir un #include « someclass.hpp » dans le fichier main.cpp et avoir accès à cette classe deux fois.

Pour plus d'informations, consultez le paragraphe inférieur here (cppreference).

+0

Eh bien, cela n'a pas de sens. Comment êtes-vous censé utiliser les classes de modèles dans d'autres fichiers? – Scott

+0

@Scott: Vous mettez le code entier pour la classe de modèle dans le fichier .hpp. –

+0

Et faites des fonctions libres en ligne si nécessaire. –

Questions connexes