2010-12-06 97 views
3

我遇到了一些问题(即,链接错误),并且显式实例化了函数模板。在Visual Studio下,项目链接ok,只有在g ++/Unix下,使用Eclipse-CDT,链接才会产生错误。函数模板的显式实例化失败(g ++)

函数调用是静态库的一部分,该静态库与大型项目中的动态库链接。 函数的体系结构如下:

  • 函数模板声明(但不执行)在我MathUtils.h文件命名空间内。其中一个函数参数本身就是一个结构模板,它在h文件中(在相同的命名空间下)被声明为
  • 功能实现和实例化在MathUtils.cpp
  • 函数调用在someFile.cpp(当然这是#include "MathUtils.h"),编译为&作为静态库的一部分链接。

推动我(几乎)疯狂的事,就是生成错误不完全可重复的,我怀疑的Eclipse是被指责(或许跳过一些步骤,虽然我用clean project每个版本之前)。

大约一个小时,调试配置内置W/O错误,但发布失败,连接错误undefined reference to...。 然后,在接下来的一个小时内,两种配置均失败。然后我做了一个小项目,只有上面提到的3个文件,并且从命令行和Eclipse编译它 - 没有任何错误。现在两个配置似乎都链接正常。

有没有人遇到过使用Eclipse-CDT的类似问题?有什么建议么?

编辑:由于问题不容易(或根本不)重现,我想这将很难得到答案。如果我有任何新的见解,我会更新。

回答

-2

www.cplusplus.com

引用因为在需要时模板编译,这迫使多文件
项目的限制:一个模板类或函数的实现(定义)必须在同一 文件其声明。这意味着我们不能将接口分离为单独的头文件 文件,并且我们必须在使用模板的任何文件中包含接口和实现。

+3

这是不正确的,找`明确instantiation`。 – 2011-04-28 06:38:18

+0

我的错误 - 我误读了类模板的函数模板。 – stackmate 2011-04-29 18:24:27

3

我有类似的问题。通过移动后的实现.cpp与类的实现来解决它。

myclass.hpp:

template <class T> 
class MyClass 
{ 
public: 
    MyClass(); 
    // other declarations 
}; 

myclass.cpp:

#include "myclass.hpp" 

template <class T> 
MyClass<T>::MyClass() 
{ 
} 

template class MyClass<int>; 
template class MyClass<bool>;