模板函数定义和实现分开写时遇到的问题

定义了一个类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里面。

posted @ 2024-06-28 10:55  thammer  阅读(16)  评论(0编辑  收藏  举报