LNK2019和LNK1120具有模板功能

时间:2009-10-14 21:59:02

标签: c++ linker-errors

SO上遇到这两个链接器错误的问题后,我再次使用它们。但是,这一次来源似乎还处于另一个角度。

编译器错误表明它无法找到带有签名""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;
}

我该怎么做才能解决这个问题?

2 个答案:

答案 0 :(得分:5)

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

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

在myClass.h中包含myClass.cpp,或者只在头文件中定义所有内容。

答案 1 :(得分:3)

必须在头文件中定义函数模板。类方法的模板不是该规则的例外。将方法的定义从“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”。