模板函数定义和实现分开写时遇到的问题
定义了一个类A,里面有个模板函数。因为我习惯每个类的声明和实现分开用*.h
,*.cpp
写。所以类A的源码如下:
A.h
#ifndef A_H
#define A_H
class A
{
public:
A();
template <typename T>
void fuck(T a);
};
#endif //A_H
A.cpp
#include "A.h"
A::A()
{
}
template <typename T>
void A::fuck(T a)
{
}
main.cpp
#include "A.h"
int main(int argc, char *argv[])
{
A a;
a.fuck<int>(1);
return 0;
}
编译的时候提示:
main.cpp:6: undefined reference to `void A::fuck<int>(int)'
未定义的引用,也就是说编译main.cpp
时,他不认识void A::fuck<int>(int)
是个啥。下面再看一个例子:
test.cpp
void foo(int a);
void test()
{
foo(1);
}
编译这个文件时,同样提示"undefined reference to `foo(int)'"。很明显,声明了foo的原型,但是未实现foo,因此符号表里面是查不到这个符号的。
再看上面的函数模板,首先需要了解函数模板是啥。函数模板实际是告诉编译器自动生成函数的一个规则,模板自身不会被编译。再结合最开始的例子,我们知道编译器在编译代码时是对cpp文件逐个进行编译的,因此编译main.cpp时发现使用了函数模板,通过头文件A.h找到了函数模板的定义,结果按模板生成函数时,找不到生成规则,因为生成规则在A.cpp里面。