模板类及其方法

时间:2009-10-19 22:44:14

标签: c++ templates

链接我的程序会产生一堆错误,如下所示。

/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

1 个答案:

答案 0 :(得分:4)

要调试的代码会更好,请发布一些代码,因为调试消息不够用(至少对我而言)。

现在,它听起来像一个未定义的引用,因此您可能希望确保模板类的声明和实现在同一个文件中。像往常一样没有分成.hpp和.cpp。这是模板类的缺点(一旦你理解了它们的工作方式就有意义了。)

编辑:您应该如何在其他文件中使用模板类?

我的意思是,如果你有(在一个正常的项目中):

someclass.hpp
someclass.cpp
main.cpp

然后你让someclass成为一个模板类,然后你必须将someclass的所有实现合并到它的头文件中,所以现在它将是:

someclass.hpp
main.cpp

在这两种情况下,你仍然可以在main.cpp文件中找到#include“someclass.hpp”,并且可以同时访问该类。

有关详细信息,请查看底部here (cppreference)