我已经编写了一个模板链接列表,但是当我尝试向其添加一个对象时,我从节点构造函数中抛出错误“C2512'Customer':No available default constructor available”。
代码:
#pragma once
#include <iostream>
using namespace std;
template <class T>
class node;
template <class T>
class l_list
{
public:
l_list() { head = tail = NULL; }
~l_list();
void add(T &obj);
T remove(int ID);
void print(ostream &out);
private:
node<T> *head, *tail;
};
template <class T>
class node
{
public:
template<class> friend class l_list;
node() {next = NULL;}
private:
T data;
node *next;
};
template <class T>
l_list<T>::~l_list()
{
}
template <class T>
void l_list<T>::add(T &obj)
{
node<T> *ptr = new node<T>;
ptr -> data = obj;
ptr -> next = head;
head = ptr;
if (tail == NULL) {tail = ptr;}
}
template <class T>
T l_list<T>::remove(int ID)
{
int i = 0;
node<T> * ptr = head;
while (ptr -> data -> id != ID)
{
ptr = ptr -> next;
}
}
template <class T>
void l_list<T>::print(ostream &out)
{
int i = 0;
node<T> *ptr = head;
while ( ptr != NULL )
{
out << ptr -> data << endl;
ptr = ptr -> next;
i++;
}
}
和我尝试放入列表的对象
l_list<Customer> customers;
Customer bob("Bob", "25 Bob Lane", "01bob82", "M", "bob/bob/bob");
customers.add(bob);
编辑以添加客户:
#pragma once
#include "l_list.h"
#include "Account.h"
#include <string>
using namespace std;
class Customer
{
private:
l_list<Account> accounts;
string name;
string address;
string telNo;
string sex;
string dob;
public:
Customer(string name, string address, string telNo, string sex, string dob)
{
Customer::name = name;
Customer::address = address;
Customer::telNo = telNo;
Customer::sex = sex;
Customer::dob = dob;
}
void createAccount()
{
cout << "What type of account?";
}
~Customer()
{
}
};
答案 0 :(得分:3)
这一行:
node<T> *ptr = new node<T>
尝试在T
内默认构建node
。由于没有默认构造函数,因此没有compiley = P
您可以使用复制构造函数(您定义或使用默认构造函数,只要T
正确符合The Rule of Three)或通过定义{{1}的默认构造函数来解决此问题}。如果我想加强对T
T
当然,您需要为node<T> *ptr = new node<T>(obj);
node<T>::node(const T&)
一个缓慢的早晨很抱歉,如果我在那里搞砸了什么。 = P
答案 1 :(得分:0)
问题出在void l_list :: add(T&amp; obj)的函数体中,因为如果你使用node的默认构造函数,它也会使用成员的默认构造函数,即T数据,这显然不是定义。不要使用节点的默认构造函数,而是定义一个带有参数T&amp;的节点构造函数。 obj并使用引用obj初始化成员数据。如果你只使用指向链表中节点的指针,它应该可以工作。
答案 2 :(得分:0)
投诉的原因是T data;
课程node
。
当您致电add
时,它会尝试构建T
,即Customer
。 Customer
没有没有参数的构造函数,所以它不起作用。
你可以:
data
或
obj
从add
传递到node
的构造函数并正确初始化。或
data
成为指针并分配要添加的新Customer
个对象。