2

テンプレートのリンクリストを作成しましたが、オブジェクトを追加しようとすると、ノードコンストラクターから「C2512'Customer':No Appropriatedefaultconstructoravailable」というエラーがスローされます。

コード:

#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()
    {
    }
};
4

3 に答える 3

3

この行:

node<T> *ptr = new node<T>

Tデフォルトにしようとしています-内を構築しますnode。デフォルトのコンストラクターがないため、compiley = P

これに対処するには、コピーコンストラクター( 3つのルールにT適切に準拠している限り、デフォルトのコンストラクターを定義または使用します)を使用するか、のデフォルトのコンストラクターを定義します。コンストラクトへのアクセスを強化したい場合は、前者の方が好きですTT

node<T> *ptr = new node<T>(obj);

もちろん、次の適切なコンストラクターを定義する必要がありますnode<T>::node(const T&)

class node
{
public:
    template<class> friend class l_list;

    // T-copy-ctor-based constructor
    node(const T& obj) : data(obj), next(NULL) {};

private:
    T data;
    node *next;
};

遅い朝だったので、何かを台無しにしてしまったらごめんなさい。= P

于 2012-11-29T19:48:18.867 に答える
0

問題はvoidl_list:: add(T&obj)の関数本体にあります。これは、ノードのデフォルトコンストラクターを使用すると、メンバーのデフォルトコンストラクター、つまりTデータも使用するためです。これは明らかに定義されていません。nodeのデフォルトのコンストラクターを使用しないでください。代わりに、引数T&objを取り、参照objでメンバーデータを初期化するノードコンストラクターを定義してください。リンクリスト内のノードへのポインタのみを使用する場合は、機能するはずです。

于 2012-11-29T19:48:11.813 に答える
0

苦情の理由はT data;あなたのnodeクラスにあります。を呼び出すとadd、を作成しようとします。TこれはCustomer。です。Customer引数のないコンストラクターがないため、機能しません。

あなたは出来る:

  1. デフォルトのコンストラクターを追加します(パラメーターなし)
  2. に正しく割り当てることができるように、代入演算子を追加しますdata

また

  • objfromaddをのコンストラクターに渡し、node正しく初期化します。

また

  • ポインタになり、追加する新しいオブジェクトをdata割り当てます。Customer
于 2012-11-29T19:49:30.887 に答える