我想實現一個使用堆作爲基類的左樹。以下是heap.h的內容:C++繼承問題
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> try.obj :錯誤LNK2001:無法解析的外部符號l「public:void __thiscall myclass :: hello(int)」(?hello @?$ myclass @ H @@ QAEXH @ Z) 1> c:\ users \ meher和\ documents \ visual studio 2010 \ Projects \ try \ Debug \ try.exe:致命錯誤LNK1120:1個未解析的外部設備
你能告訴我現在我哪裏出錯了嗎?由於
沒有解決方案的工作。令人驚訝的是,當我沒有從堆繼承(只是將它聲明爲類leftist_tree {...}),我沒有得到任何編譯錯誤。 –
Anand
2010-10-02 01:14:18
我似乎無法重現錯誤。什麼是'leftist_node'?是你的第三個代碼塊,mytree的定義,在與'leftist.cpp'相對應的編譯單元中? – SingleNegationElimination 2010-10-02 01:21:19
始終將模板代碼放在頭文件中。在這種情況下,你在leftist.cpp中顯示的內容應該在leftist.h中。此外,你的leftist_tree聲明拋棄了'heap'方法的'virtual',所以確保你不要試圖在'leftist'的子類中「覆蓋」這些方法,否則會變得怪異。 – 2010-10-02 02:36:13