链接我的程序会产生一堆错误,如下所示。
/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()'
这是否意味着我必须为我要使用的每个模板参数都有一个Generic :: MethodName(和Generic :: MethodName)?我希望不是。我的印象是模板应该避免这种情况。
编辑:这是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 :(得分:4)
要调试的代码会更好,请发布一些代码,因为调试消息不够用(至少对我而言)。
现在,它听起来像一个未定义的引用,因此您可能希望确保模板类的声明和实现在同一个文件中。像往常一样没有分成.hpp和.cpp。这是模板类的缺点(一旦你理解了它们的工作方式就有意义了。)
编辑:您应该如何在其他文件中使用模板类?
我的意思是,如果你有(在一个正常的项目中):
someclass.hpp
someclass.cpp
main.cpp
然后你让someclass成为一个模板类,然后你必须将someclass的所有实现合并到它的头文件中,所以现在它将是:
someclass.hpp
main.cpp
在这两种情况下,你仍然可以在main.cpp文件中找到#include“someclass.hpp”,并且可以同时访问该类。
有关详细信息,请查看底部here (cppreference)。