将自定义类与自定义模板容器

时间:2015-09-26 11:58:36

标签: c++ class templates

我尝试定义自定义模板容器,然后将自定义类对象(Students)添加到其中。这是我的代码:

class Student{
public:
    string subject;
    Student(string _subject){
        subject = _subject;
    }
};

这是我的LinkedList模板代码

template <class T>
class LinkedList{

private:
    struct Node{
        Node *next;
        T value;
    };
    Node *root;
    Node *curr;
    int count;

public:
    LinkedList() : count(0), root(NULL){}
    void add(T val){
        if (root == NULL){
            root = new Node;
            root->value = val;
            root->next = NULL;
            curr = root;
        }
        else{
            curr->next = new Node;
            curr = curr->next;
            curr->value = val;
            curr->next = NULL;
        }
        count++;
    }

    void print(){
        for (Node *itr=root; itr != NULL; itr = itr->next){
            cout << itr->value << endl;
        }
    }
};

int main(){
    LinkedList<Student> a;
    Student sam("Math");
    a.add(sam)
}

当我运行它时,我得到了

  

linkedlist.cpp:在构造函数'LinkedList :: Node :: Node()'中:   linkedlist.cpp:27:从'void LinkedList :: add(T)[with T = Student]'实例化

     

linkedlist.cpp:133:从这里实例化

     

linkedlist.cpp:27:错误:没有匹配函数来调用'Student :: Student()'   linkedlist.cpp:18:注意:候选人是:Student :: Student(std :: string)

     

linkedlist.cpp:15:注意:学生::学生(const学生&amp;)   linkedlist.cpp:在成员函数'void LinkedList :: add(T)[with T = Student]':

     

linkedlist.cpp:40:注意:首先需要合成方法'LinkedList :: Node :: Node()'

我不知道这个错误究竟意味着什么,以及它要求我做什么。如果我这样做:

int main(){
    LinkedList<Student*> a;
    Student sam("Math");
    a.add(&sam);
}

它运作得很好。

但是存储对象的引用并不是我所追求的。如何让我的LinkedList复制我想要添加的对象?

提前致谢!

2 个答案:

答案 0 :(得分:0)

首先......

#include <utility>

现在,改变这个......

struct Node {
    Node* next;
    T     value;
};

有关...

struct Node {
    Node* next;
    T     value;

    inline Node(const T &value) : value(value), next(nullptr) {}
    inline Node(T &&value) : value(std::move(value)), next(nullptr) {}
};

而且,这......

void add(T val) {
    if(this->root == nullptr) {
        this->root = new Node;
        this->root->value = val;
        root->next = NULL;
        curr = root;
    } else {
        curr->next = new Node;
        curr = curr->next;
        curr->value = val;
        curr->next = NULL;
    }

    count++;
}

为此...

void add(const T &val){
    if(this->root == nullptr) {
        this->root = new Node(val);
        this->curr = root;
    } else {
        this->curr->next = new Node(val);
        this->curr = this->curr->next;
    }

    this->count++;
}

void add(T &&val){
    if(this->root == nullptr) {
        this->root = new Node(std::move(val));
        this->curr = root;
    } else {
        this->curr->next = new Node(std::move(val));
        this->curr = this->curr->next;
    }

    this->count++;
}

您将使用隐式默认构造函数创建Node对象new Node。这意味着调用Node::value的默认构造函数。然后,你能告诉我是否有?不。Student没有默认构造函数,所以这不起作用。

顺便说一句,我对你的代码做了一些小的重新设计,所以要避免出现的问题。作为奖励,您现在可以使用移动语义(尝试list.add(Student("Joe")))!

另外,请记住在构造函数初始化列表中初始化currnullptr

答案 1 :(得分:-1)

学生必须提供默认构造函数。试试这个:

Student(string _subject = "")

因为当您执行new Node时,它会创建一个Node对象,因此会创建Node*类的TNode属性。如果T类没有默认构造函数,则编译器不知道如何创建对象。

错误信息的内容是:

error: no matching function for call to ‘Student::Student()’ linkedlist.cpp:18: note: candidates are: Student::Student(std::string)

找不到默认构造函数Student::Student(),它只发现一个字符串作为参数Student::Student(std::string)