2013-05-27 175 views
1

我正在學習C++,現在我正在使用Template。模板類型未定義

我試圖實現鏈表:

ListElement.hpp

#ifndef LIST_ELEMENT_HPP_ 
#define LIST_ELEMENT_HPP_ 

template <class Type> class SingleLinkedList; 

template <class Type> 
class ListElement 
{ 
public: 
    ListElement(const Type element); 
    ~ListElement(void); 
public: 
    Type val; 
    ListElement* next; 
}; 

#endif 

ListElement.cpp:

#include "ListElement.hpp" 

ListElement<Type>::ListElement(const Type element) 
{ 
    *next = NULL; 
    val = element; 
} 


ListElement<Type>::~ListElement(void) 
{ 
} 

我得到的錯誤ListElement.cpp相對於TypeType is undefined

我發現了很多關於如何實現鏈表但沒有使用分離的hpp和cpp的例子。

你知道我該如何解決這個錯誤?

+0

最後的代碼(類和實施預處理之後)都有,如果你不使用特定的實例出現在同一個文件實施。 – chris

+0

不使用單獨的源文件和頭文件?當你使用模板時,它並不真正起作用,因爲你的模板類的用戶需要_whole_類定義,並且包含了這些函數。 –

+2

另外,你在構造函數中初始化'next'不會達到你期望的效果!它將'NULL'分配給_random_位置。你想'next = nullptr;'(或'next = 0;')將_pointer_設置爲NULL。 –

回答

2

第一個問題:

您需要修改您要定義模板類的成員函數的方式:

template<typename Type> // <== ADD THIS! 
ListElement<Type>::ListElement(const Type& element) 
//          ^
//          And perhaps also this? 
//          (don't forget to modify the 
//          corresponding declaration if 
//          you change it) 
{ 
    *next = NULL; 
    val = element; 
} 

問題二:

你應該將這些定義移動到包含該定義的相同頭文件中類模板,或者鏈接器會抱怨未定義的引用。有關更多信息,請參閱this Q&A on StackOverflow

第三個問題:

在你的構造函數,你正在通過取消引用未初始化的指針導致未定義的行爲。你不應該這樣做:

*next = NULL; 
^^^^^^^^^^^^^ 
Undefined Behavior! next is uninitialized and you are dereferencing it! 

反倒是:

next = NULL; 

甚至更​​好(使用構造函數初始化列表和C++ 11的nullptr):

template<typename Type> 
ListElement<Type>::ListElement(const Type& element) : 
    val(element), 
    next(nullptr) 
{ 
} 
+0

我還有一個問題:如果你設置'next(nullptr)',爲什麼要設置'* next = NULL;'? – VansFannel

+0

@VansFannel:對不起,這是一個錯誤的複製粘貼的結果。你不需要事實上,我編輯了答案;) –

+0

@AndyProwl,如果'Type'不是默認構造的,或者如果這很昂貴的話:) – chris

1

首先 - 一般來說,您不能在不同的文件中分割模板類的聲明和實現。其次 - 在實現之前應該是模板decl。

template<typename Type> 
ListElement<Type>::ListElement(const Type element) 
{ 
    next = NULL; 
    val = element; 
} 
+0

啊,我不知道我不能分割模板類的聲明和實現。謝謝。 – VansFannel

0

在第一次嘗試添加

template<class Type> 

每個函數之前.cpp文件

它不會工作。 (鏈接器錯誤)因此,將所有實現移到.h文件。

那麼也許你應該改變

ListElement(const Type element); 

ListElement(const Type &element);