2010-10-28 45 views
0

我正在嘗試編寫一些容器類來實現C++中的主數據結構。頭文件是在這裏:這是什麼錯誤? (爲什麼它不會在其他類中發生?)

#ifndef LINKEDLIST1_H_ 
#define LINKEDLIST1_H_ 

#include <iostream> 
using namespace std; 

template<class T> class LinkedList1; 
template<class T> class Node; 

template<class T> 
class Node 
{ 
    friend class LinkedList1<T> ; 
public: 
    Node<T> (const T& value) 
    { 
     this->Data = value; 
     this->Next = NULL; 
    } 
    Node<T>() 
    { 
     this->Data = NULL; 
     this->Next = NULL; 
    } 
    T Data; 
    Node* Next; 
}; 

template<class T> 
class LinkedList1 
{ 
    friend class Node<T> ; 
public: 
    LinkedList1(); 
// LinkedList1<T>(); 
    ~LinkedList1(); 
    // Operations on LinkedList 
    Node<T>* First(); 

    int Size(); 
    int Count(); 
    bool IsEmpty(); 
    void Prepend(Node<T>* value); //O(1) 
    void Append(Node<T>* value); 
    void Append(const T& value); 
    void Insert(Node<T>* location, Node<T>* value); //O(n) 
    Node<T>* Pop(); 
    Node<T>* PopF(); 
    Node<T>* Remove(const Node<T>* location); 
    void Inverse(); 
    void OInsert(Node<T>* value); 
    // TODO Ordered insertion. implement this: foreach i,j in this; if i=vale: i+=vale, break; else if i<=value<=j: this.insert(j,value),break 
    void print(); 
private: 
    Node<T>* first; 
    int size; 
}; 

#endif /* LINKEDLIST1_H_ */ 

當我嘗試在其他類中使用它,比如像這樣:發生

void IDS::craete_list() 
{ 
    LinkedList1<int> lst1 = LinkedList1<int>::LinkedList1<int>(); 
} 

此錯誤:

undefined reference to 'LinkedList1<int>::LinkedList1<int>()' 

的構造類是公共的,它的頭文件包含在內。我也試圖包含這個類的.cpp文件,但是這沒有幫助。我用完全相同的方式寫了其他類如SparseMatrix和DynamicArray,並且沒有錯誤!...

+0

有您所提供的模板的實際定義是什麼?它們是從模板被調用的地方到達的嗎? (還要注意,語法是錯誤的,變量定義的正確語法是:'LinkedList1 lst1;' - 沒有賦值和對構造函數的顯式調用不正確) – 2010-10-28 08:28:01

+1

一般而言,模板類*必須*整個東西)放入頭文件中,因爲需要* source *來創建不同的實例。 – 2010-10-28 08:28:16

+0

@大衛·羅德里格斯:是的。 – 2010-10-28 08:30:36

回答

0

創建對象,這樣做:。

void IDS::craete_list() 
{ 
    LinkedList1<int> lst1; 
} 

至於連接問題,如果您在源(CPP)文件中定義的模板類,你需要包括它,而不是頭文件。

+0

相同的錯誤發生。我包括他們兩個,只有頭和只有cpp。但在每種情況下都會再次出現相同的錯誤 – 2010-10-28 08:47:21

2

有許多說法可以(應該)在您的代碼上進行。我還假設沒有理由手動實現鏈接列表,而不是使用STL以外的其他功能,所以適當的標籤會很好。

  • 不建議使用在using namespace包括文件
  • 沒有理由class Node的向前聲明,因爲它緊跟
  • 沒有必要使用Node<T>類裏面,經常Node足夠
  • 你不需要使用this->數據成員
  • 最好是&較短的使用構造函數初始化列表
  • 錯誤:使用this->Data = NULL;你含蓄地要求T是一個指針。讓Data默認構造
  • 爲什麼Node將LinkedList1聲明爲朋友,我沒有看到它在您提供的代碼中的任何用法?

您的代碼可能是這樣的:

#ifndef LINKEDLIST1_H_ 
#define LINKEDLIST1_H_ 

template<class T> class LinkedList1; 

template<class T> 
class Node 
{ 
    friend class LinkedList1<T> ; 
public: 
    Node (const T& value): Data(value), Next(NULL) {} 
    Node(): Next(NULL) {} 
    T Data; 
    Node* Next; 
}; 
+0

是的,它的功課:)我會改變我的代碼。但是你確定沒有必要使用命名空間嗎?當它從頭文件中移除時,cout變得不確定。乾杯。 – 2010-10-28 11:49:43

+1

@Sorush:是的,你需要完全符合'std :: cout'的標準。原因是,如果任何人使用你的代碼(作爲庫)幷包含你的文件,她就會「繼承」你的這個命名空間。這當然只是一個良好實踐的建議 - 在私有的.cpp文件中使用'namespace'而不是在includes中 – davka 2010-10-28 12:33:48

相關問題