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 に答える