模板链接列表:没有成员可用错误

时间:2013-02-26 22:33:22

标签: c++ visual-studio-2010 templates linked-list

请查看以下代码

LinkedList.h

template <typename T>

class LinkedList
{
public:
    T *first;

    LinkedList()
    {
        first = 0;
    }
    ~LinkedList(){}


    T *Delete()
    {
    }

    T *Delete(const int key)
    {
    }

    void Display()
    {
    }

    T *Find(const int key)
    {
    }

    void Insert(T* newLink)
    {
        //newLink->next = first;
        //first = newLink;
    }

    bool IsEmpty()
    {
        return (first==0);
    }
};

Weapon.h

#pragma once
#include "GameObject.h"
#include "Stack.h"
#include "Round.h"

class Weapon :
    public GameObject
{
public:
    Weapon(int);
    ~Weapon(void);

    Stack <Round>   stack1;
    Weapon *next;

    void Display();
};

Weapon.cpp

#include "Weapon.h"
#include <iostream>

using namespace std;

Weapon::Weapon(int size) : stack1(size)
{

}


Weapon::~Weapon(void)
{
}

在此处,Weapon表示链接列表中的链接。 Next是指向列表中下一个武器的指针。但我怎么能访问它?我在链接列表的Insert()方法中的尝试不起作用。我评论过他们。请帮忙!

1 个答案:

答案 0 :(得分:1)

    void Insert(T* newLink)
    {
        //newLink->next = first;
        //first = newLink;
    }

不会“正常”,因为T是模板类型。它可能包含也可能不包含“next”元素。这是使用模板的错误方法。

T应该是LinkedList所拥有的数据类型,而不是LinkedList本身。

#include <iostream>
using namespace std;

template <typename T>
class LinkedList 
{
  struct Node {
    T data;
    struct Node *next;
  };

  Node *head,*tail;

  void init(T& data)
  {
    if(head == NULL){
      head = new Node;
      head->data = data;
      head->next = NULL;
      tail = head;
    }
  }
public:
  LinkedList()
  {
    head = NULL;
    tail = NULL;
  }
  LinkedList(T& data)
  {
    head = NULL;
    tail = NULL;
    init(data);
  }

  ~LinkedList()
  {
    deleteLinkedList(head);
  }

  bool IsEmpty()
  {
    if(head == NULL) return true;
    return false;
  }

  void Display()
  {
    for(Node *h = head; h != NULL; h=h->next){
      cout << h->data;
    }
  }

  void Insert(T data)
  {
    if(this->IsEmpty()){
      init(data);
      return;
    }
    Node *n = new Node;
    n->data = data;
    n->next = NULL;
    tail->next = n;
    tail = n;
  }

  void deleteLinkedList(Node *hd)
  {
    if(hd->next == tail){
      delete tail;
      tail = hd;
      return;
    }
    deleteLinkedList(hd->next); 
  }
};

int main(int argc, char *argv[])
{
  LinkedList<int> list;
  list.Insert(10);
  list.Insert(20);
  list.Insert(30);
  list.Display();
  return 0;
}