2011-01-01 13 views
7

私は大学のプロジェクト用のテンプレートを設計しようとしています。テンプレートクラス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); 

この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' 

が問題であるかを理解templeteリンククラスを使用しています。私はfollwingコードを書きました。私は本当に はあなたに感謝あなたの助けを使用することができます:)

答えて

14

これらのエラーメッセージは、実際に一緒に属します。

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

これはライン41で、テンプレートパラメータLを導入することを意味します。私のコピーで、これは

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

を指し、その宣言は、ライン26におけるテンプレートパラメータをシャドウ:

template <class L>//error one 
class LinkedList 

あなたは友人の宣言でテンプレートパラメータの名前を変更する必要があります。

編集:関連する言語仕様は、テンプレートパラメータが は( ネストされたスコープを含む)をその範囲内に再宣言してはならない14.6.1/7

あります。テンプレートパラメータ は、テンプレート名 と同じ名前であってはなりません。

あなたはconst LinkedList<L> listToprintLを参照するとき、それはあなたが友人やクラスのLのLを意味するかどうかは明らかではありません。だからfriendメンバ関数の宣言から

template <class L> 

を削除

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

申し訳ありませんが、名前を変更する必要がある理由とその理由を理解できません。 –

+0

@inna karpasas:私の編集を参照してください。 –

+0

テンプレート化されていない 'friend'の' friend'テンプレート関数を変更することも検討してください。テンプレート化された 'operator <<'のすべてのインスタンス化に対してクラス内部(この場合は 'LinkedList ')にアクセスする必要はありません。クラスにアクセスするには 'operator <<(ostream&、const LinkedList &)'のみが必要です。 'A'は議論のための一般的なものですが、これはプレースホルダーではなく、特定の型(' int'または 'double')ですが、具体的なものです。 –

3

を書きます。

コードのどこかにusing namespace stdがある場合を除いて、のコードをstd::ostreamに置き換える必要があります。

そうしないと、コードは正常に見えます。

+0

'クラスL 'の" –

+0

@inna karpasas:テストするコード全体がなくても難しいですが、@nimrodmの答えは正しいです。おそらく、テンプレート化された 'operator <<'が、適切な型を取る単一の 'operator <<'となることは望ましくありません。あなたが次のエラーを出す理由は、パーサを混乱させる質問には表示されていないことです。 –

関連する問題