模板类型未定义

时间:2013-05-27 12:11:20

标签: c++ templates

我正在学习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 Type Type is undefined相关联。

我找到了很多关于如何实现链接列表但没有使用分离的hpp和cpp的例子。

您知道我该如何解决此错误吗?

3 个答案:

答案 0 :(得分: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)
{
}

答案 1 :(得分:1)

首先 - 通常你不能在不同的文件中拆分模板类的声明和实现。 其次 - 在实现之前应该是模板decl。

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

答案 2 :(得分:0)

首先尝试添加

template<class Type>

在.cpp文件中的每个函数之前

这不行。 (链接器错误)所以将所有实现移动到.h文件。

那么也许你应该改变

ListElement(const Type element);

ListElement(const Type &element);