在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;
}
我该怎么做才能解决这个问题?
答案 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”。