2009-10-14 90 views
0

SO上遇到这两个链接器错误后,我再次遇到这些问题。但是,这次来源似乎在另一个点上。带模板功能的LNK2019和LNK1120

编译器错误显示它找不到具有签名""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const "的功能。

但是,将myClass.cpp的内容移动到main.cpp的作品。不知道为什么(的myClass.cpp所有其他内容不存在这个问题。(其它功能都没有模板)。

myClass.h

#ifndef X 
#define X 
class MyClass { 
public: 
    template<class T> 
    T myFunction (int someArgument) const; 
}; 
#endif 

myClass.cpp

#include "myClass.h" 
template<class T> 
T MyClass::myFunction (int someArgument) const { 
    return T(); 
} 

main.cpp

#include "myClass.h" 
int main() { 
    MyClass a(); 
    a.myFunction<unsigned int>(42); 
    return 0; 
} 

我该怎么做fi x这个问题?

回答

5

因为在main.cpp中,编译器可以找到模板函数的定义。

模板无法编译,编译器需要能够看到文件的定义,并且它无法在文件中看到。

要么在myClass.h中包含myClass.cpp,要么只是定义标题中的所有内容。

2

功能模板必须在头文件中定义。类方法的模板不是该规则的例外。将方法的定义从'MyClass.cpp'移动到头文件'MyClass.h'中。

myClass.h 

#ifndef X 
#define X 

class MyClass { 
public: 
    template<class T> 
    T myFunction (int someArgument) const; 
}; 

template<class T> 
T MyClass::myFunction (int someArgument) const { 
    return T(); 
} 

#endif 

不需要在“MyClass的”的全部,直到第一个非模板成员你“MyClass.cpp”。