2013-11-03 252 views
1

我的編譯器編譯器錯誤給了我這個錯誤,我不明白爲什麼。與模板成員函數

`P3_A2.o: In function `allocateAlot(_sync*)': 
/home/***/workspace_qnx/P3_A2/P3_A2.cpp:69: undefined reference to `int* 
StaticMem::allocate<int>(int*)'` 

這裏是P3_A2.cpp

void allocateAlot(sem_t * sleepHere)
{

for (int i = 0; i < 10000; i++)
{

Int32 * t = StaticMem::allocate(t);

}
sem_wait(sleepHere);

}

這裏的StaticMem.h

類StaticMem
{
...

template <class T> static T * allocate(T * ptr);

}

這裏的StaticMem.cpp

template <class T>
T * StaticMem::allocate(T * ptr)
{

ptr = (T*) reserveContiguousMemory(sizeof(T));
return ptr;

}

有人能解釋其中這個錯誤來自哪裏?

+0

模板函數必須在* header *文件中定義。定義必須在使用它的任何地方都可見。不要嘗試在'.cpp'文件中定義模板函數(除非這是您使用這些函數的唯一文件)。 – AnT

回答

2

在C++中,模板函數與普通函數不同。尤其是,您不能將它們放入C++源文件中,分別編譯它們,然後期望代碼鏈接。原因是C++模板不是代碼 - 它們的代碼是模板 - 只在需要時才進行實例化和編譯。

因爲你已經把你的模板函數allocate的實施放在.cpp文件,程序將無法鏈接。要解決此問題,請將此功能的實施移至StaticMem.h文件中。這樣,包含StaticMem.h的任何文件都將看到模板的實現,所以當模板實例化時,將會生成和編譯實現,從而修復鏈接器錯誤。

希望這有助於!

+0

謝謝,工作:-) – user2950911