0

SO上的这两个链接器错误出现一些问题后,我又遇到了。然而,这一次的源头似乎在另一个点。

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

但是,移动 to 的内容是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;
}

我能做些什么来解决这个问题?

4

2 回答 2

6

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

模板不能编译,编译器需要能看到文件的定义,不能跨文件看到。

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

于 2009-10-14T22:02:32.353 回答
4

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

于 2009-10-14T22:01:52.447 回答