2

可能重复:
C++ 模板,链接错误

我有两个链接错误,我不知道代码有什么问题以及如何修复它们:

main.obj:-1: 错误: LNK2019: 函数“public: __thiscall”中引用的未解析外部符号“public: __thiscall A::A(void)”(??0?$A@VB@@@@QAE@XZ) B::B(void)" (??0B@@QAE@XZ)

main.obj:-1:错误:LNK2019:未解析的外部符号“public:void __thiscall A::exec(void (__thiscall B::*)(void))”(?exec@?$A@VB@@@@ QAEXP8B@@AEXXZ@Z) 在函数 "public: void __thiscall B::run(void)" (?run@B@@QAEXXZ) 中引用

稍微解释一下代码:这个类必须从派生类中执行一个函数。函数 exec 从派生类中调用,并带有派生类参数中的函数。这个函数的签名是void function();

//header.h

#ifndef HEADER_H
#define HEADER_H

template <class T>
class A
{
public:
    typedef void (T::*ExtFunc)();

    A();
    void funcA();
    void exec(ExtFunc func);
};

#endif // HEADER_H

//header.cpp

#include "header.h"

template<typename T>
A<T>::A() { }

template<typename T>
void A<T>::funcA()
{
    cout << "testA\n";
}

template<typename T>
void A<T>::exec(ExtFunc func)
{
    (T().*func)();
}

main.cpp我从 A 类派生一个类并将派生类作为模板参数传递。然后我exec通过函数执行run()函数。//main.cpp

#include <iostream>
#include "header.h"
using namespace std;

class B : public A<B>
{
public:
    B() { }

    void run()
    {
        exec(&B::funcB);
    }

    void funcB()
    {
        cout << "testB\n";
    }
};

int main()
{
    B ob;
    ob.run();

    return 0;
}

谁能告诉我这是怎么回事?...

4

1 回答 1

2

当您使用模板时,通常不能将实现放在 .cpp 文件中 - 您必须将整个类放在标题中。因此,将所有代码从 header.cpp 移动到 .h。

您可以通过在 .cpp 文件中进行显式实例化来解决此问题 - 为特定类型实例化模板。但这要求您提前知道哪些类型需要实例化,并且会阻止您添加新的实例化。唯一的好处是减少了编译时间。

于 2012-09-03T07:10:11.327 回答