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

类静态内存
{
...

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;

}

有人可以解释这个错误来自哪里吗?

4

1 回答 1

2

在 C++ 中,模板函数不同于普通函数。特别是,您不能将它们放入 C++ 源文件中,单独编译它们,然后期望代码链接。这样做的原因是 C++ 模板不是代码——它们是代码的模板——并且只在需要时被实例化和编译。

因为您已将模板函数的实现allocate放入 .cpp 文件中,所以程序不会链接。要解决此问题,请将此函数的实现移动到StaticMem.h文件中。这样,任何包含的文件都StaticMem.h将看到模板的实现,因此当模板被实例化时,将生成并编译实现,从而修复链接器错误。

希望这可以帮助!

于 2013-11-03T23:03:39.480 回答