1. ホーム
  2. c++

[解決済み] C++テンプレート - LinkedList

2022-01-28 03:11:25

質問

EDIT -- 以下回答、角度のついた中括弧を見逃していました。ありがとうございました。

私は、他のプログラムで使用できる、初歩的な単一リンクリストを書こうとしています。私はそれが組み込みとユーザー定義の型を扱うことができることを望みます、つまりそれはテンプレート化されなければなりません。

このため、私のノードもテンプレート化する必要があります。なぜなら、ノードに格納される情報が分からないからです。私は次のようにノード・クラスを書きました。

template <class T> class Node
{
    T data; //the object information
    Node* next; //pointer to the next node element

public:
    //Methods omitted for brevity
};

私のリンクリストクラスは別のクラスで実装されており、リストの末尾に新しいノードを追加する際にノードをインスタンス化する必要があります。私はこれを次のように実装しました。

#include <iostream>
#include "Node.h"
using namespace std;

template <class T> class CustomLinkedList
{
    Node<T> *head, *tail;

public:

    CustomLinkedList()
    {
        head = NULL;
        tail = NULL;
    }

    ~CustomLinkedList()
    {

    }

    //Method adds info to the end of the list
    void add(T info)
    {
        if(head == NULL) //if our list is currently empty
        {
            head = new Node<T>; //Create new node of type T
            head->setData(info);
            tail = head;
        }
        else //if not empty add to the end and move the tail
        {
            Node* temp = new Node<T>;
            temp->setData(info);
            temp->setNextNull();
            tail->setNext(temp);
            tail = tail->getNext();
        }
    }

    //print method omitted
};

私は以下のようにドライバ/テストクラスを設定しました。

#include "CustomLinkedList.h"
using namespace std;

int main()
{
    CustomLinkedList<int> firstList;

    firstList.add(32);
    firstList.printlist();
    //Pause the program until input is received
    int i;
    cin >> i;

    return 0;
}

しかし、コンパイル時にエラーが発生します。 error C2955: 'Node' : クラステンプレートの使用にはテンプレート引数リストが必要です。 - これは、私のaddメソッドにある次の行を指しています。

Node* temp = new Node<T>;

私のドライバクラスで作成されたときにリンクリストに渡されたので、なぜこれが型に関する情報を持っていないのか理解できません。 Nodeに型情報を渡すにはどうしたらいいのでしょうか?

別のクラスではなく、プライベートなノード構造体を作成し、両方のクラスのメソッドを1つのファイルにまとめるべきでしょうか。この方法で問題が解決するかどうかは分かりませんが、そうなる可能性はあると思います。しかし、可能であれば、別々のクラスを作成する方が良いと思います。

アンドリューさん、ありがとうございます。

解決方法は?

試してみたいこと

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

また、リストの設計のヒントを得るには、もちろんstd::listを見ればいいのですが、ちょっと大変なこともあります。