2011-01-01 13 views
7

Próbuję zaprojektować szablon dla mojego projektu uniwersyteckiego. Napisałem kod follwing:Szablon klasy 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); 

to templete używa klasy łącza 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' 

I dont zrozumieć, na czym polega problem. I naprawdę może korzystać z pomocy dziękuję :)

Odpowiedz

14

komunikaty te naprawdę są ze sobą:

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

Oznacza to, że w linii 41, to wprowadzenie parametru szablonu L; w moim egzemplarzu, to odnosi się do

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

I że deklaracja cienie parametru szablonu w wierszu 26:

template <class L>//error one 
class LinkedList 

Trzeba zmienić nazwę parametru szablonu w deklaracji znajomego.

Edit: Odpowiednia specyfikacja jest język 14.6.1/7

Szablon parametr nie będzie redeclared w jej zakres (w tym zagnieżdżonych zakresów). Szablon-parametr nie ma tej samej nazwy co nazwa szablonu .

Kiedy patrz L w const LinkedList<L> listToprint, to nie jest jasne, czy oznacza to, L z przyjacielem lub L klasy. Więc napisać

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

Przepraszam, ale nie rozumiem, co muszę zmienić nazwę i dlaczego? –

+0

@inna karpasas: Zobacz moją edycję. –

+0

Należy również rozważyć zmianę funkcji szablonu "przyjaciel" dla zwykłego niesformatowanego 'przyjaciela'. Nie potrzebujesz (ani nie chcesz), aby zapewnić dostęp do swoich wewnętrznych klas (w tym przypadku 'LinkedList ' dla określonego typu 'A') do wszystkich wystąpień operatora' '. Aby uzyskać dostęp do klasy, potrzebujesz tylko operatora << (ostream &, const LinkedList &) '. Zauważ, że 'A' jest * ogólne * dla dyskusji, ale nie jest to obiekt zastępczy, ale konkretny typ (' int' lub 'double', ale konkretny z nich) –

3

Wystarczy wyjąć

template <class L> 

z deklaracji funkcji friend członkowskim.

Należy również zamienić zastosowania ostream na std::ostream, chyba że w swoim kodzie znajduje się using namespace std.

W przeciwnym razie kod wygląda dobrze.

+0

daje mi błąd" deklaracja " 'class L '" –

+0

@inna karpasas: Trudno jest przetestować cały kod, ale odpowiedź @nimrodm jest właściwa. Prawdopodobnie nie chcesz zaprzyjaźnić się z szablonem 'operator <<', ale pojedynczym 'operatorem <<', który przyjmuje odpowiednie typy.Przyczyną następnego błędu, który otrzymujesz, może być wszystko, czego nie ma w pytaniu, które myli parser. –

Powiązane problemy