在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
Run Code Online (Sandbox Code Playgroud)
myClass.cpp
#include "myClass.h"
template<class T>
T MyClass::myFunction (int someArgument) const {
return T();
}
Run Code Online (Sandbox Code Playgroud)
main.cpp
#include "myClass.h"
int main () {
MyClass a();
a.myFunction<unsigned int>(42);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我该怎么做才能解决这个问题?
函数模板必须在头文件中定义。类方法的模板也不例外。将方法的定义从“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
Run Code Online (Sandbox Code Playgroud)
在“MyClass”的第一个非模板成员之前,根本不需要“MyClass.cpp”。
因为在main.cpp中,编译器可以找到模板函数的定义.
模板无法编译,编译器需要能够看到文件的定义,并且它无法跨文件查看.
要么在myClass.h中包含myClass.cpp,要么只在头文件中定义所有内容.