2012-10-09 15 views
1

我從模板類繼承有一些問題。下面的代碼不編譯,示出這樣的錯誤:main.cpp : undefined reference to OBJ1<1000>::method()未定義對...的引用:從模板類繼承

parent.h

template <int nb> 
class PARENT 
{ 
    PARENT() {}; 
    ~PARENT() {}; 

    virtual void method() = 0; 
    enum { nb_ = nb }; 
}; 

obj1.h

#include "parent.h" 

template <int nb> 
class OBJ1 : public PARENT<nb> 
{ 
    virtual void method(); 
}; 

obj1.cpp

#include "obj1.h" 

template <int nb> 
void OBJ1<nb>::method() 
{ 
    //code 
} 

的main.cpp

#include "obj1.h" 

int main() 
{ 
    OBJ1<1000> toto; 
    toto.method(); 
} 

我在哪裏錯了?

回答

4

在處理模板時,您不能將聲明和實現分解爲單獨的文件。有關原因,請參閱this question(以及有關解決此問題的更簡明說明)。

這需要合併(您也可以#include實現文件到頭部,讓預處理器執行合併。):

// obj1.hpp 

#include "parent.h" 

template <int nb> 
class OBJ1 : public PARENT<nb> 
{ 
    virtual void method(); 
}; 

template <int nb> 
void OBJ1<nb>::method() 
{ 
    //code 
} 
+0

的代碼仍然不能編譯,但是你固定的一個錯誤。 :) 謝謝。 – Patouf

+0

當您像這裏所做的那樣定義類模板的方法時,最好將該行外定義標記爲「inline」。如果沒有'inline',如果多個源文件對同一個模板參數使用該函數,則會導致違反一個定義規則。 –

+0

@DavidHammen模板沒有例外嗎?另見http://stackoverflow.com/q/3694899/1025391 – moooeeeep