2017-03-08 46 views
0

C++ noob here。我試圖通過實施 鏈接列表類作爲其數據結構來創建學生信息程序。templateClassName <className> t;無法將類分配給模板類參數

LinkedList.h

#pragma once 
#include <stdexcept> 

template <typename T> 
class LinkedList 
{ 
private: 
    struct Node 
    { 
     T elem; 
     Node *prev; 
     Node *next; 
    }; 

    Node *header; 
    Node *trailer; 
    int size; 

public: 
    LinkedList() 
    { 
     header = new Node; 
     trailer = new Node; 
     header->next = trailer; 
     trailer->prev = header; 
    } 

    ~LinkedList() 
    { 
     while (!isEmpty()) 
      removeFirst(); 
     delete header; 
     delete trailer; 
    } 

    const int& n_elem() const 
    { 
     return size; 
    } 

    const bool isEmpty() const 
    { 
     return size == 0; 
    } 

    const T& getFirst() const 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     return header->next->elem; 
    } 

    const T& getLast() const 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     return trailer->prev->elem; 
    } 

    void addFirst(const T& item) 
    { 
     addBetween(item, header, header->next); 
    } 

    void addLast(const T& item) 
    { 
     addBetween(item, trailer->prev, trailer); 
    } 

    void addAt(int index, const T& item) 
    { 
     Node *node = header; 
     for (int i = 0; i < index; i++) 
      node = node->next; 
     addBetween(item, node, node->next); 
    } 

    const T removeFirst() 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     return remove(header->next); 
    } 

    const T removeLast() 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     return remove(trailer->prev); 
    } 

    const T removeAt(int index) 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     Node *node = header; 
     for (int i = 0; i < index; i++) 
      node = node->next; 
     return remove(node->next); 
    } 

    const T& itemAt(int index) const 
    { 
     if (isEmpty()) 
      throw std::out_of_range("List is empty."); 
     Node *node = header; 
     for (int i = 0; i < index; i++) 
      node = node->next; 
     return node->next->elem; 
    } 

protected: 
    void addBetween(const T& item, Node *predecessor, Node *successor) 
    { 
     Node *newest = new Node; 
     newest->prev = predecessor; 
     newest->next = successor; 
     predecessor->next = newest; 
     successor->prev = newest; 
     size++; 
    } 

    const T remove(Node *node) 
    { 
     Node *predecessor = node->prev; 
     Node *successor = node->next; 
     predecessor->next = successor; 
     successor->prev = predecessor; 
     T oldItem = node->elem; 
     size--; 
     delete node; 
     return oldItem; 
    } 
}; 

Student類定義如下。

Program.cpp

#include "stdafx.h" 
#include <iostream> 
#include <string> 
#include "LinkedList.h" 

using namespace std; 

class Student 
{ 
public: 
    string name; 
    string id; 
    int score; 
    static const int total = 100; 
    double grade; 

    Student(string n, string i, int s) 
    { 
     name = n; 
     id = i; 
     score = s; 
     grade = getGrade(score); 
    } 

private: 
    double getGrade(int score) 
    { 
     return (23.0/3.0 - ((20.0 * score)/(3.0 * total))); 
    } 
}; 

LinkedList<Student> l; 

int main() 
{ 
    //Some code here 
    return 0; 
} 

我不知道原因

LinkedList<Student> l; 

產生一個錯誤:

LinkedList<Student>::Node::Node(void)': attempting to reference a deleted function 

但是當我使用:

LinkedList<Student*> l; 

沒有錯誤。

請幫忙。 我正在使用Visual Studio 2015.

對不起,對英語不好。

+0

試試你的鏈接列表導入前移動類定義或把類一個.cpp和.h文件。 – ajputnam

回答

0

LinkedList<Student>,內部結構Node看起來是這樣的:

struct Node 
{ 
    Student elem; 
    Node *prev; 
    Node *next; 
}; 

所以每一個節點都包含一個學生。

然而,你會注意到,Student有一個構造函數參數:

Student(string n, string i, int s) 

,它不會有一個構造函數不帶參數。

所以,如果你寫new Node,計算機將創建一個節點,並作爲的那部分,會開一個Student,但它不能這樣做,因爲它沒有任何論據給Student「的構造函數。

這就是(大約)「刪除的函數」在這裏意味着什麼 - 通常編譯器會爲你創建一個Node構造函數,但在這種情況下它不能。

new Node不起作用,因爲Node沒有構造函數。

也許最簡單的解決這裏只是爲了給Student一個無參數的構造以及 - 是這樣的:

Student() 
{ 
    name = ""; 
    id = ""; 
    score = 0; 
    grade = getGrade(score); 
} 
+0

謝謝!你解釋得很好。 –

+0

正確的方法是向'Node'添加一個帶'T'的構造函數。並且'header'和'trailer'是'nullptr',並且真正指向預期的節點而不是'header-> next'。 – Jarod42

相關問題