2009-10-19 74 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