我正在学习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的例子。
您知道我该如何解决此错误吗?
答案 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);