C ++继承问题

时间:2010-10-02 00:59:36

标签: c++ inheritance

我正在尝试使用堆作为基类来实现左派树。以下是heap.h的内容:

template <class T>

class heap {
public:
    virtual void init(T*) = 0;
    virtual void insert(T*) = 0;
    virtual T delete_min() = 0;
};

以下是leftist.cpp的内容:

#include "heap.h"

template <class T>
class leftist_tree : public heap<T> {
private:
    T* root;
public:
    void init(T* a) {}
    void insert(T* a) {}
    T delete_min() {T a; return a;}
};

我使用以下定义将另一个类leftist_node作为参数传递给该类:

leftist_tree<leftist_node> mytree;

我正在为函数init,insert和delete_min获取LNK 2001未解析的外部符号错误。我究竟做错了什么?

修改

好的,我在这一点上给出的例子太复杂了。我试图在较小的范围内重现相同的错误,以便有人可以更容易地识别问题。我创建了以下示例文件。

try.cpp

#include "stdafx.h"
#include "myclass.h"

int _tmain(int argc, _TCHAR* argv[])
{
    myclass<int> a;
    a.hello(3);
    return 0;
}

myclass.h

template <class T>

class myclass {
public:
    void hello(T);
};

myclass.cpp

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

template <class T>
void myclass<T>::hello(T a){
    cout<<a<<endl;
    system("pause");
}

我收到类似的错误消息:

1&gt; try.obj:错误LNK2001:未解析的外部符号“public:void __thiscall myclass :: hello(int)”(?hello @?$ myclass @ H @@ QAEXH @ Z) 1&gt; c:\ users \ meher anand \ documents \ visual studio 2010 \ Projects \ try \ Debug \ try.exe:致命错误LNK1120:1个未解析的外部

你能告诉我我现在哪里出错吗?感谢

4 个答案:

答案 0 :(得分:3)

模板未针对该类型进行实例化。最简单的方法是从编译中删除.cpp,并将其包含在使用模板的cpp中。

另一个简单的答案是在.h。

中定义整个模板

答案 1 :(得分:3)

模板函数的处理方式与常规函数略有不同。在您尝试使用它之前,编译器实际上不会编译该函数。如果您尝试使用它的唯一地方是.cpp,其中函数的主体未定义,它假定它必须在其他地方编译并为链接器提供引用以便稍后填写。

在你的情况下,你在leftist.cpp中定义了函数的主体,但你没有在那里使用它,你在其他地方使用它。如果你已经在.h文件中定义了它,那么在你尝试使用它的任何地方都可以使用该定义,一切都会很好。如果你已经在leftist.cpp中的某个地方使用了函数,那么就会创建函数,并且链接器会修复所有内容。

一般规则是在头文件中定义所有模板函数的主体。

答案 2 :(得分:1)

每当看到此错误时

错误LNK20XX未解析的外部符号

这意味着链接链接器时无法找到函数定义。在您的情况下,它是错误

希望这会对你有所帮助。 如果您需要更多帮助,请告诉我

<强> PK

答案 3 :(得分:1)

以下内容应该有效(使用g ++测试):

// File: heap.hh --------------------------
template <class T>
class heap {
public:a
    virtual void init(T*) = 0;
    virtual void insert(T*) = 0;
    virtual T delete_min() = 0;
};

// File: leftist_tree.hh ------------------
#include "heap.hh"
template <class T>
class leftist_tree : public heap<T> {
private:
    T* root;
public:
    void init(T* ) {}
    void insert(T* ) {}
    T delete_min() {T a; return a;}
};

// File: leftist_node.hh ------------------
struct leftist_node {
    int value;
};

// File: leftist_main.cpp -----------------
#include "leftist_tree.hh"
#include "leftist_node.hh"

int main() {
    leftist_tree< leftist_node > mytree;
}