2009-10-19 75 views
0

链接我的程序会产生一堆如下所示的错误。模板类和它们的方法

/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()' 

这是否意味着我必须为每个模板参数使用通用::方法名(和通用::方法名)?我希望不是。我的印象是模板应该避免这种情况。

编辑:这里是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

好吧,应该是在通用后面的LCDText和LCDGraphic,在最后一段中被shift-和shift-包围。 – Scott 2009-10-19 22:48:09

+0

这里是从前面的相关问题... http://stackoverflow.com/questions/1590688/class-is-not-a-template-type – razlebe 2009-10-19 22:50:56

+0

谢谢sgreeve。我几乎编辑了这个问题,但认为这个问题太无关紧要了。 – Scott 2009-10-19 22:52:22

回答

4

更多的代码调试就好了,请为调试消息是不够的,去发布一些代码(我ATLEAST)。

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

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

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

someclass.hpp 
someclass.cpp 
main.cpp 

然后你做SomeClass的模板类,那么你必须合并所有SomeClass的实施到其头文件,所以它现在会是:

someclass.hpp 
main.cpp 

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

欲了解更多信息,请看底部段落here (cppreference)

+0

那么这是没有道理的。你应该如何在其他文件中使用模板类? – Scott 2009-10-19 22:50:22

+0

@Scott:您将模板类的整个代码放在.hpp中。 – 2009-10-19 22:53:19

+0

并在必要时使内联函数内联。 – 2009-10-19 22:55:24