templateClassName <classname> t;无法将类分配给模板类参数

时间:2017-03-08 23:07:22

标签: c++ visual-c++

C ++ noob。我试图通过实施创建学生信息计划 Linked-List类作为其数据结构。

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;
    }
};

学生班定义如下。

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。

抱歉英语不好。

1 个答案:

答案 0 :(得分:0)

LinkedList<Student>中,内部结构Node如下所示:

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

所以每个节点都包含一个学生。

但是,您要注意Student有一个带参数的构造函数:

Student(string n, string i, int s)

并且它没有不带参数的构造函数。

因此,如果您要编写new Node,计算机将创建一个节点,作为其中的一部分,它将创建一个Student,但它不能这样做,因为它不会#&# 39; t有任何论据可以提供给Student的构造函数。

那是(大约)什么&#34;删除功能&#34;这意味着 - 通常编译器会为你创建一个Node构造函数,但在这种情况下它不能。

因此new Node无效,因为Node没有构造函数。

这里最容易解决的问题可能就是给Student一个无参数的构造函数 - 比如:

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