2013-01-05 59 views
1

Possible Duplicate:
C++ template, linking error
Undefined symbol on a template operator overloading function模板子類 - 無法解析的外部

所以我有一個抽象類Button:

class Button 
{ 
public: 
    int x, y, width, height; 
    std::string label, text; 
    bool checkForClick(int mouseX, int mouseY); 
    virtual void click(int mouseX, int mouseY) =0; 
    virtual void draw(); //has a default implementation which can be overridden 
}; 

和子類,我想成爲一個模板類:

template <typename T> 
class IncrementButton : public Button 
{ 
public: 
    T& controlValue; 
    T increment; 
    T minVal, maxVal; 

    IncrementButton(T& controlValue) : controlValue(controlValue) {} 

    void click(int mouseX, int mouseY); 
    void draw(); 
}; 

重寫的方法如下所示:

template <typename T> 
void IncrementButton<T>::click(int mouseX, int mouseY) 
{ 
    //do something with controlValue 
} 

template <typename T> 
void IncrementButton<T>::draw() 
{ 
    //use value of controlValue 
} 

但這不會編譯。它給我的錯誤:

Error 1 error LNK2001: unresolved external symbol "public: virtual void __thiscall IncrementButton<float>::click(int,int)" ([email protected][email protected]@@[email protected]) 

...和抽獎一樣的東西()

任何想法?我對C++比較陌生,所以我希望可能有些愚蠢的做法我錯了。

+2

在頭文件中的覆蓋的方法?或者cpp文件?如果他們在cpp文件中,他們需要在頭文件中:http://stackoverflow.com/questions/1353973/c-template-linking-error – JaredC

+1

我懷疑你需要閱讀這個:http:// www.parashift.com/c++-faq/separate-template-fn-defn-from-decl.html。 –

+0

@JaredC工作!謝謝。 – mclaassen

回答

0

您可以通過將您的定義移動到頭文件中來解決您的問題。還有其他的解決方案,雖然過,但我會告訴別人解釋他們better--看到這些鏈接:

FAQ

Another Answer

+0

另一種解決方案實際上並未通過此處鏈接的答案進行解釋,而是在定義模板函數的.cpp文件中使用顯式實例化。我認爲這很重要,儘管將所有定義放入標題中通常是首選解決方案。 – jogojapan

+0

@jogojapan奧利上面的鏈接提到,但我指出了更一般的常見問題主題。感謝您指出了這一點。 – JaredC