0

我有以下节点:

template <class T>
struct ListItem
{
    T value;
    ListItem<T> *next;
    ListItem<T> *prev;

    ListItem(T theVal)
    {
        this->value = theVal;
        this->next = NULL;
        this->prev = NULL;
    }
 };

我必须声明这个列表项的一个实例。我知道如何声明一个不是模板的结构实例,如下所示:

node* x = new node;
 x = head; (or whatever)

现在我该怎么做?如果我遵循上述程序,那么我认为我应该执行以下操作:

ListItem<T>* temp = new ListItem<T>;

但编译器给出的错误是上面没有匹配的函数,并且 ListItem 需要 1 个参数。快速帮助

4

3 回答 3

2

您必须选择一种类型作为您的模板参数,并将一个值传递给您的构造函数,因为没有默认值。例如,相当于您对非模板所做的事情是:

ListItem<double>* temp = new ListItem<double>(3.1416);

但这不仅仅是创建一个实例。它正在创建一个具有动态分配的实例,并初始化一个指向其位置的指针。如何“创建实例”很简单

ListItem<double> temp(3.1416);

不过要小心指向动态分配对象的原始指针。你真的应该在这里使用智能指针

请注意,您也可以为您的类提供默认构造函数:

template <class T>
struct ListItem
{
    T value;
    ListItem<T> *next;
    ListItem<T> *prev;

    ListItem() : value(), next(NULL), prev(NULL) {}
    ListItem(T theVal) : value(theVal), next(NULL), prev(NULL) {}
 };

请注意,我已将您的原始构造函数更改为使用初始化列表,因为这是执行此操作的首选方式。

于 2013-02-06T17:08:10.010 回答
2

您需要为构造函数提供一个值!

于 2013-02-06T17:11:23.227 回答
1

在表单中构建项目:

T* t = new T;

使用T. 在您的情况下,您没有提供默认构造函数,并明确禁止编译器生成默认构造函数,因为您有一个带值的构造函数。

使用该构造函数采用以下形式:

T* t = new T(U);

要使用代码中的具体示例:

// This will use the default constructor of ListItem<T>, which you _didn't_ provide
ListItem<T>* temp = new ListItem<T>;

// This will use single value constructor ListItem<int>(int), which you did provide.
ListItem<int>* temp = new ListItem<int>(7);

// The generic version would then be -- where T is actually default constructable
ListItem<T>* temp = new ListItem<T>(T());

例如,将值添加到类型的链表int需要您知道要添加的值:

int value_to_add = 5;
ListItem<int>* temp = new ListItem<int>(value_to_add);

如果您的问题是关于如何分配“头”节点,这通常是指向列表中第一项的指针:

// pointer, does _not_ point to an instantiated value (yet)
ListItem<int>* head = nullptr;

// in the add function:
ListItem<int>* value = new ListItem<int>(value_to_add);

// if the list was empty...
if(nullptr == head)
   head = value;   // head now points to the first value
于 2013-02-06T17:07:57.080 回答