2012-09-22 28 views
0

我得到了以下錯誤:未定義的引用無效 「功能」 C++

features.cpp:(.text+0x4f6): undefined reference to `void Convolve<float>(CImageOf<float>, CImageOf<float>&, CImageOf<float>)' 

所以,在我features.cpp文件,添加以下的頭文件,內容是:

template <class T> 
void Convolve(CImageOf<T> src, CImageOf<T>& dst, 
       CFloatImage kernel); 

我在ubuntu 64bit上用GCC編譯這個。我意識到上面的錯誤是因爲我的頭文件中的內容與引用不匹配,但這是因爲模板,所以我不應該有這個問題嗎?還有什麼呢?

我雙重檢查我的電話進行卷積,而實際上這是我使用的類型:

Convolve(CFloatImage, CFloatImage, CFloatImage); 

我不能真正找到上述

+2

CFloatImage內核!= CImageOf Borgleader

+0

看起來像你放在頭模板函數__declaration__只,而不是__definition__。哪裏定義了Convolve? 'CFloatImage'只是'typedef'用於'CImageOf ',對不對? – Rost

回答

0

由於在OP中出現的chat問題可能是在沒有正確鏈接的Makefile中。

沒有定義,但在.h文件中的模板聲明(如你們中的一些人所建議的)。我認爲OP會混淆這些條款。

但是在.cpp文件中有一個模板的定義以及實例化了Convolve<float>(和其他)的(非模板)函數定義。

所以重複它:代碼是正確的,但構建例程不是。

4

到錯誤的任何引用如果你把一個函數模板放在.cpp文件並使用它在不同的翻譯單元,你需要明確實例化的模板,例如:

template 
void Convolve<float>(
    CImageOf<float> src, 
    CImageOf<float>& dst, 
    CFloatImage kernel); 

基本上,編譯器可以實例化一個TEMPL只有當它看到了它的定義。如果您希望模板自動實例化,您需要在標題中定義它。

+0

我沒有把模板放在.cpp文件中。我在頭文件中定義了上述內容 – mugetsu

+0

在這種情況下,您正在使用的模板被定義在其他地方並未實例化。編譯器清楚地認爲你正在調用一個函數模板,該模板聲明在某個地方,但沒有定義。在構建可執行文件時是否包含了所有必需的庫? –