шаблон класса с ++ - PullRequest
       1

шаблон класса с ++

7 голосов
/ 01 января 2011

Я пытаюсь разработать шаблон для моего университетского проекта. я написал следующий код:

#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);

этот шаблон использует класс ссылок класса

#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'

Я не понимаю, в чем проблема. я действительно могу использовать вашу помощь спасибо :) 1007 *

Ответы [ 2 ]

14 голосов
/ 01 января 2011

Эти сообщения об ошибках действительно принадлежат друг другу:

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

Параметр шаблона не должен быть повторно объявлен в своей области (включая вложенные области видимости).Параметр шаблона не должен совпадать с именем шаблона.

Когда вы ссылаетесь на L в const LinkedList<L> listToprint, неясно, имеете ли вы в виду L друга или Lкласса.Так что пиши

template <class L1> friend ostream & operator<<(ostream& os,
    const LinkedList<L1> listToprint);
3 голосов
/ 01 января 2011

Просто удалите

 template <class L>

из объявления функции-члена friend.

Вам также необходимо заменить ostream на std::ostream, если у вас нет using namespace std где-то в вашем коде.

В противном случае код выглядит хорошо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...