C ++错误模板构建

时间:2016-01-11 15:56:37

标签: c++ templates building

我的程序构建存在问题。我现在花了几个小时搜索错误,我不明白是什么问题。

这是我的代码: 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;

非常感谢你帮助:/

1 个答案:

答案 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依赖,则存在设计错误