我尝试定义自定义模板容器,然后将自定义类对象(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复制我想要添加的对象?
提前致谢!
答案 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"))
)!
另外,请记住在构造函数初始化列表中初始化curr
到nullptr
!
答案 1 :(得分:-1)
学生必须提供默认构造函数。试试这个:
Student(string _subject = "")
因为当您执行new Node
时,它会创建一个Node
对象,因此会创建Node*
类的T
和Node
属性。如果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)