2016-11-05 5 views
1

Мне нужно создать связанный список с шаблоном, но я понятия не имею, почему он не работает, я уже создал связанные списки, но никогда не с шаблонами. Сейчас моя проблема заключается в том, что, если я создаю список все нормально, но когда я пытаюсь вставить что-нибудь к нему, я получаю следующие ошибки:Связанный список с шаблоном

Error C2664 'Nodo<D>::Nodo(Nodo<D> &&)': cannot convert argument 1 from 'const int' to 'const Nodo<D> &' Datos2 d:\google drive\visual studio 2015\projects\datos2\datos2\listaSimple.h 69 


Error C2664 'Nodo<D>::Nodo(Nodo<D> &&)': cannot convert argument 1 from 'const int' to 'const Nodo<D> &' Datos2 d:\google drive\visual studio 2015\projects\datos2\datos2\listaSimple.h 73 

с моим следующим кодом:

//linkedList.h 
#pragma once 
#ifndef _LISTASIMPLE_H 
#define _LISTASIMPLE_H 

template<class D> 
struct Nodo 
{ 
    int carga; 
    int binario; 

    D caracter; 

    Nodo<D> *Siguiente;//means next 
}; 



template<class D> 
class listaSimple 
{ 

public: 
    listaSimple(); 
    ~listaSimple(); 

    void InsertarInicio(const D&); 
    bool ListaVacia(); 
    void Mostrar(); 




private: 
    Nodo<D> *primero; 
    Nodo<D> *ultimo; 

}; 

template<class D> 
listaSimple<D>::listaSimple() 
{ 
    primero = NULL; 
} 

template<class D> 
listaSimple<D>::~listaSimple() 
{ 
    Nodo<D> *aux; 
    while (primero != NULL) 
    { 
     aux = primero; 
     primero = primero->Siguiente; 
     delete aux; 
    } 
} 

template<class D> 
void listaSimple<D>::InsertarInicio(const D& dato) 
{ 
    if (ListaVacia()) 
    { 
     primero = new Nodo<D>(dato); 
    } 
    else 
    { 
     Nodo<D> *nodoNuevo = new Nodo<D>(dato); 
     nodoNuevo->Siguiente = primero; 
     primero = nodoNuevo; 
    } 
} 

template<class D> 
bool listaSimple<D>::ListaVacia() 
{ 
    if (primero == NULL) 
    { 
     return true; 
    } 
    else 
    { 
     return false; 
    } 
} 

template<class D> 
inline 
void listaSimple<D>::Mostrar() 
{ 
    Nodo<D> *aux = primero; 
    while (aux != NULL) 
    { 
     cout << aux->caracter << "->"; 
     aux = aux->Siguiente; 
    } 
} 

и

//Source.cpp 
#include <iostream> 
#include <string> 
#include "linkedList.h" 


using namespace std; 

int main() { 
    listaSimple<int> Nueva; 
    Nueva.InsertarInicio(5); 

    system("pause"); 
    return 0; 
} 
+0

'if (EmptyList)' это фактический код? Поскольку вы, похоже, хотите вызвать функцию, в этом случае вам не хватает скобок, например: if (EmptyList()) ' – UnholySheep

+0

@UnholySheep yep, извините, ошибка перевода. спасибо, что указали – Twhite1195

+0

Что такое 'Siguiente'? Также 'class D' не определен.'listaSimple NewList' все неправильно, вы, вероятно, имеете в виду' linkedList NewList', где мой 'D' - это некоторый класс, который не показан. –

ответ

1

См исправленную версию Node и linkedList. Обратите внимание, что Node и linkedList не содержат никакой информации о фактических данных. Фактически вы можете объявить данные (struct MyData) в конце.

Для печати я добавил функцию:

node->data.print(); 

Таким образом Node и linkedList не являются непосредственно отвечает за печать данных, и они не должны ничего знать о данных. Они могут запросить DataType для печати данных. DataType должен содержать функцию print для печати собственного контента.

template<typename DataType> 
struct Node 
{ 
    DataType data; 
    Node<DataType> *Next; 
    Node() 
    { 
     Next = nullptr; 
    } 
}; 

template<typename DataType> 
class linkedList 
{ 
public: 
    linkedList() 
    { 
     first = NULL; 
    } 

    ~linkedList() 
    { 
     Node<DataType> *aux; 
     while (first != NULL) 
     { 
      aux = first; 
      first = first->Next; 
      delete aux; 
     } 
    } 

    void InsertBegining(const DataType& data) 
    { 
     Node<DataType> *newNode = new Node<DataType>; 
     newNode->data = data; 
     if (first) 
     { 
      newNode->Next = first; 
      first = newNode; 
     } 

     first = newNode; //<== you forgot this 
    } 

    void Print() 
    { 
     Node<DataType> *walk = first; 
     while (walk) 
     { 
      walk->data.print(); 
      walk = walk->Next; 
     } 
    } 

private: 
    Node<DataType> *first; 
}; 

Теперь вы можете объявить MyData и использовать его. Убедитесь, что MyData включает функцию print. Также MyData должен быть POD (простые старые данные, он не может содержать указатели) из-за способа передачи данных.

int main() 
{ 
    struct MyData 
    { 
     int charge; 
     int binario; 
     char ch; 
     void print() 
     { 
      cout << charge << ", " << binario << ", " << ch << "\n"; 
     } 
    }; 

    linkedList<MyData> list; 
    MyData data; 

    data.binario = 1; 
    data.ch = 'A'; 
    data.charge = 10; 
    list.InsertBegining(data); 

    data.binario = 2; 
    data.ch = 'B'; 
    data.charge = 20; 
    list.InsertBegining(data); 

    list.Print(); 

    system("pause"); 
    return 0; 
} 

Другой метод:

Вы можете добавить << перегрузку оператора для MyData

struct MyData 
{ 
    int charge; 
    int binario; 
    char ch; 

    friend std::ostream& operator<< (std::ostream &out, MyData &x) 
    { 
     out << x.ch << ", " << x.binario << ", " << x.charge; 
     return out; 
    } 
}; 

Так MyData умеет печатать сам. Пример:

MyData data; 
data.ch = 'A'; 
data.binario = 1; 
data.charge = 10; 
cout << data << "\n"; 

Это должно печатать "A, 1, 10".

Тогда вы можете изменить linkList::Print() к

... 
void Print() 
{ 
    Node<DataType> *walk = first; 
    while (walk) 
    { 
     std::cout << walk->data << "\n"; 
     walk = walk->Next; 
    } 
} 

Теперь linkedList не зависит от MyData, пока MyData имеет << перегрузку оператора (и его данные POD). Вы также можете использовать этот связанный список для основных типов. Пример:

linkedList<int> test; 
test.InsertBegining(1); 
test.InsertBegining(2); 
test.Print(); 
+0

это здорово! Но у меня все еще есть некоторые вопросы, мне нужно объявлять структуру каждый раз, когда я хочу использовать шаблон? – Twhite1195

+0

Это очень простой вопрос, подумайте о том, как он работает, и попробуйте объявление в разных местах, чтобы узнать, что работает. Вы можете объявить «MyData» в глобальной области действия и использовать его везде. –

+0

Я думал об этом, но поскольку шаблоны дают мне такую ​​головную боль, я должен сначала спросить. В любом случае, спасибо за то, что помогли мне, я думаю, что теперь я получаю это зависание. – Twhite1195