LNK2019在C ++中链接错误

时间:2012-09-03 07:05:17

标签: c++ class templates linker external

  

可能重复:
  C++ template, linking error

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

  

main.obj:-1:错误:LNK2019:未解析的外部符号“public:   __thiscall A :: A(void)“(?? 0?$ A @ VB @@@@ QAE @XZ)在函数”public:__thiscall 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)

稍微解释一下代码: 该类必须从派生类执行函数。使用派生类参数中的函数从派生类调用function 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;
}

有谁能告诉我发生了什么事?......

1 个答案:

答案 0 :(得分:2)

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

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