1

我正在学习 C++,现在我正在使用 Template。

我正在尝试实现一个链接列表:

列表元素.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.cppType上收到与:相关的错误Type is undefined

我找到了很多关于如何实现链接列表的示例,但没有一个使用单独的 hpp 和 cpp。

你知道我该如何解决这个错误吗?

4

3 回答 3

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;
}

第二个问题:

您应该将这些定义移动到包含类模板定义的同一头文件中,否则链接器将抱怨未定义的引用。有关更多信息,请参阅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)
{
}
于 2013-05-27T12:13:03.040 回答
1

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

template<typename Type>
ListElement<Type>::ListElement(const Type element)
{
     next = NULL;
     val = element;
}
于 2013-05-27T12:12:47.087 回答
0

首先尝试添加

template<class Type>

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

它行不通。(链接器错误)因此将所有实现移至 .h 文件。

那么也许你应该改变

ListElement(const Type element);

ListElement(const Type &element);
于 2013-05-27T12:13:43.730 回答