LNK2019和LNK1120具有模板功能

Eta*_*tan 0 c++ linker-errors

SO上遇到这两个链接器错误的问题后,我再次使用它们.然而,这一次来源似乎在于另一点.

编译器错误表明它找不到带签名的函数""public: unsigned int __thiscall MyClass::myFunction<unsigned int>(int)const ".

但是,将内容移动myClass.cppmain.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)

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

AnT*_*AnT 5

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


GMa*_*ckG 5

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

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

要么在myClass.h中包含myClass.cpp,要么只在头文件中定义所有内容.