2013-05-27 50 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);