2011-01-01 22 views
7

provo a progettare un modello per il mio progetto universitario. ho scritto il codice follwing:template class C++

#ifndef _LinkedList_H_ 
#define _LinkedList_H_ 
#include "Link.h" 
#include <ostream> 
template <class L>//error one 
class LinkedList 
{ 
private: 
Link<L> *pm_head; 
Link<L> * pm_tail; 
int m_numOfElements; 
Link<L>* FindLink(L * dataToFind); 
public: 
LinkedList(); 
~LinkedList(); 
int GetNumOfElements(){return m_numOfElements;} 
bool Add(L * data); 
L *FindData(L * data); 

template <class L> friend ostream & operator<<(ostream& os,const LinkedList<L> listToprint);//error two 
    L* GetDataOnTop(); 
    bool RemoveFromHead(); 
    L* Remove(L * toRemove); 

questo Templete utilizza la classe di collegamento templete

#ifndef _Link_H_ 
#define _Link_H_ 
template <class T>//error 3 
class Link 
{ 
private: 
T* m_data; 
Link* m_next; 
Link* m_prev; 
public: 
Link(T* data); 
~Link(void); 
bool Link::operator ==(const Link& other)const; 

/*getters*/ 
Link* GetNext()const {return m_next;} 
Link* GetPrev()const {return m_prev;} 
T* GetData()const {return m_data;} 
//setters 
void SetNext(Link* next) {m_next = next;} 
void SetPrev(Link* prev) {m_prev = prev;} 
void SetData(T* data) {m_data = data;} 

}; 

error one: shadows template parm `class L' 
error two:declaration of `class L' 
error three: shadows template parm `class T' 

Non capisco qual è il problema. Posso davvero usare il tuo aiuto voi :)

risposta

14

Questi messaggi di errore grazie davvero appartengono insieme:

a.cc:41: error: declaration of ‘class L’ 
a.cc:26: error: shadows template parm ‘class L’ 

Ciò significa che, in linea 41, si introduce un parametro di template L; nella mia copia, questo si riferisce a

template <class L> friend ostream & operator<<(ostream& os, 
       const LinkedList<L> listToprint);//error two 

E tale dichiarazione ombre il parametro di template in linea 26:

template <class L>//error one 
class LinkedList 

È necessario rinominare il parametro di modello nella dichiarazione amico.

Edit: La specifica lingua in questione è 14.6.1/7

Un modello-parametro non deve essere ridichiarato nel suo ambito (compresi scope nidificati). Un parametro modello non deve avere lo stesso nome del nome del modello .

Quando si fa riferimento a L in const LinkedList<L> listToprint, non è chiaro se si intende la L di un amico o di L della classe. Quindi scrivere

template <class L1> friend ostream & operator<<(ostream& os, 
    const LinkedList<L1> listToprint); 
+0

scusate ma non capisco cosa ho bisogno di rinominare e perché? –

+0

@inna karpasas: vedere la mia modifica. –

+0

Considerate anche la possibilità di cambiare la funzione di template 'friend' per un' amico' semplice non basato su modelli. Non hai bisogno (né vuoi) di fornire l'accesso ai tuoi interni di classe (in questo caso 'LinkedList ' per un particolare tipo' A') a tutte le istanze di un operatore di modelli << '. Hai solo bisogno dell'operatore << (ostream &, const LinkedList &) 'per accedere alla classe. Si noti che 'A' è * generale * per la discussione, ma questo non è un segnaposto, ma un tipo particolare (' int', o 'double', ma uno concreto) –

3

è sufficiente rimuovere la

template <class L> 

dalla dichiarazione di funzione friend membro.

È inoltre necessario sostituire gli usi di ostream con std::ostream a meno che non si disponga di uno using namespace std da qualche parte nel codice.

In caso contrario, il codice sembra corretto.

+0

mi dà l'errore" dichiarazione di 'classe L '" –

+0

@inna karpasas: È difficile senza l'intero codice da testare, ma la risposta di @nimrodm è giusta. Probabilmente non vorrai fare amicizia con un operatore di template << << ma un singolo operatore << << che prende i tipi appropriati.Il motivo per il prossimo errore che stai ricevendo può riguardare tutto ciò che non è mostrato nella domanda che confonde il parser. –