我的程序构建存在问题。我现在花了几个小时搜索错误,我不明白是什么问题。
这是我的代码: ListeBase.h
#ifndef LISTEBASE_H
#define LISTEBASE_H
#include "Timing.h"
#include "Professeur.h"
#include "Cours.h"
#include "Local.h"
#include "Groupe.h"
template<class T> struct Cellule
{
T Valeur ;
Cellule<T> *psuivant ;
};
template <class T> class ListeBase
{
protected:
Cellule<T> *Ptete;
public:
ListeBase();
ListeBase(ListeBase<T>& LB);
virtual ~ListeBase();
Cellule<T> * getTete(void)const;
void setTete(Cellule<T> *Te);
int estVide(void)const;
int getNombreElements(void)const;
void Affiche(void);
virtual T* insere(const T& val)=0;
};
#endif
ListeBase.cpp
#include "../Header/ListeBase.h"
#include <iostream>
using namespace std;
template <class T> ListeBase<T>::ListeBase()
{
cout << "Methode Constructeur ListeBase" << endl;
Ptete=0;
}
template <class T> ListeBase<T>::ListeBase(ListeBase<T>& LB)
{
setTete(LB.getTete());
}
template <class T> ListeBase<T>::~ListeBase()
{
Cellule<T> *Temp,*Test;
cout << "Methode destructeur ListeBase" << endl;
do
{
Temp=Ptete->psuivant;
delete Ptete; // IL FALLAIT UN OPERATOR= DE TIMING SINON IL Y AVAIT DEUX ELEMENT A LA MEME ADRESSE
Ptete=Temp;
}while(Ptete!=0);
cout << "Test" << endl;
}
template <class T> Cellule<T>* ListeBase<T>::getTete(void)const
{
cout << "Methode getTete" << endl;
return Ptete;
}
template <class T> void ListeBase<T>::setTete(Cellule<T> *Te)
{
cout << "Methode SetTete" << endl;
if(Te!=0)
this->Ptete=Te;
}
template <class T> int ListeBase<T>::estVide(void)const
{
if(getTete()==0)
return 0;
return 1;
}
template <class T> int ListeBase<T>::getNombreElements(void)const
{
Cellule<T> *Temp;
int i=0;
Temp=getTete();
while((*Temp).psuivant!=0)
{
i++;
Temp=(*Temp).psuivant;
}
return i;
}
template <class T> void ListeBase<T>::Affiche(void)
{
Cellule<T> *Temp;
int i=0;
cout << "Methode affiche" << endl;
Temp=getTete();
while(Temp!=0)
{
cout << Temp->Valeur << endl;
Temp=Temp->psuivant;
}
cout << "FIN AFFICHE" << endl;
}
template class ListeBase<int>;
template class ListeBase<Timing>;
template class ListeBase<Professeur>;
template class ListeBase<Groupe>;
template class ListeBase<Local>;
template class ListeBase<Cours>;
Liste.cpp
#include "../Header/Liste.h"
template <class T> Liste<T>::Liste():ListeBase<T>()
{
cout << "Methode COnstructeur Liste" << endl;
}
template <class T> Liste<T>::Liste(const Liste<T>& L)
{
cout << "Methode COnstructeur Liste COPIE" << endl;
this->setTete(L.getTete());
}
template <class T> Liste<T>::~Liste()
{
cout << "Methode Destructeur Liste" << endl;
}
template <class T> T* Liste<T>::insere(const T& Val)
{
Cellule<T>* Temp;
Temp=new Cellule<T>;
cout << "Methode insere Liste" << endl;
Temp->psuivant=this->getTete();
Temp->Valeur=Val;
this->setTete(Temp);
return &this->getTete()->Valeur;
}
template class Liste<int>;
template class Liste<Timing>;
template class Liste<Professeur>;
template class Liste<Groupe>;
template class Liste<Local>;
template class Liste<Cours>;
Liste.h
#ifndef LISTE_H
#define LISTE_H
#include "ListeBase.h"
#include "Groupe.h"
#include "Professeur.h"
#include "Local.h"
#include "Cours.h"
template <class T>
class Liste : public ListeBase<T>
{
public:
Liste();
Liste(const Liste<T>& L);
~Liste();
T* insere(const T& Val);
};
#endif
Cours.h
#ifndef COURS_H
#define COURS_H
#include "Liste.h"
#include "string.h"
#include "Event.h"
#include "Professeur.h"
class Cours:public Event
{
friend ostream& operator<<(ostream& s,const Cours& C);
private:
char* Prof;
Liste<int> Groupes;
public:
Cours();
Cours(const int Code,const char* Intitule,const char* Lieu,const Timing& timing, Professeur& P);
Cours(const int Code,const char* Intitule,const char* Lieu,const Timing& timing, Professeur& P,Liste<int>&G);
Cours(const Cours& C);
Cours& operator=(const Cours& C);
int operator>(const Cours& C)const;//
int operator<(const Cours& C)const;// DEMANDE DEXPLICATION SUR LA VALEUR DU RETURN
int operator==(const Cours& C)const;//
int compH(const Cours& C)const;
Liste<int> getGroupes(void)const;
void setGroupes(const Liste<int> G);
char* getProf(void)const;
void setProf(const char* P);
};
#endif
这是错误消息:
In file included from Cpp/../Header/Cours.h:4:0,
from Cpp/../Header/ListeBase.h:6,
from Cpp/ListeBase.cpp:1:
Cpp/../Header/Liste.h:11:31: error: expected template-name before ‘<’ token
class Liste : public ListeBase<T>
^
Cpp/../Header/Liste.h:11:31: error: expected ‘{’ before ‘<’ token
Cpp/../Header/Liste.h:11:31: error: expected unqualified-id before ‘<’ token
In file included from Cpp/../Header/ListeBase.h:6:0,
from Cpp/ListeBase.cpp:1:
Cpp/../Header/Cours.h:15:14: error: field ‘Groupes’ has incomplete type
Liste<int> Groupes;
非常感谢你帮助:/
答案 0 :(得分:0)
你有一个循环包括:
ListeBase.cpp - &gt; ListeBase.h - &gt; Cours.h - &gt; Liste.h - &gt; ListeBase.h
此时包含Liste.h,类ListeBase未知。使用#ifndef LISTEBASE_H
停止Cirular包含更改您的设计(我不确定基本模板是否必须包含一些应用标题)
另外,如前所述,在编译期间必须知道模板实现,因此实现应该在头文件中,而不是在源文件中
修改强>
使用模板的常用方法:
ListeBase.h,它仅定义和实现ListeBase
Liste.h,定义和实现从BaseListe继承的Liste,
每个需要使用模板的头或源必须包含Liste.h并直接使用它,而不在cpp之前声明任何内容
通过我们的设计,在我看来很难使用CPP来定义模板。根据通告包括
我建议你这样使用。这是正确的方式。
注意:您可以看到模板的“extern”关键字(仅限C ++ 11)
<强> EDIT2 强>
在每种情况下,最小化依赖关系很重要,因此,在任何时候,当包含标题时,请考虑:“我的实现/标题是否真的需要知道这个?”和“哪个文件使用哪个?”
对于最后一个问题,如果响应涉及ciruclar依赖,则存在设计错误