2017-05-31 60 views
-1

這是我第一次使用模板。我僅將模板用於結構的元素。試圖讓模板在C++中的結構元素工作

using namespace std; 
    namespace lulz{ 

    template<typename T> 
    struct Contacto { 
    string Cname; 
    string Apellidos; 
    string NumTel; 
    string email; 
    T sexo; 
    Contacto *Proximo; 
    }; 
    typedef Contacto* ContactPtr; 


    class Lista { 
    public: 
    Lista(); 
    ~Lista(); 
    bool ContactoVacio(ContactPtr Contact1); 
    void InsertContact(ContactPtr& Contact1, Contacto Temp); 
    void BuscarContact(ContactPtr Contact1, string Name, string Lastname); 
    void Display(ContactPtr Contact1); 
    void Deletes(ContactPtr Contact1); 

    ContactPtr Cabeza; 
    }; 

我模板的結構,但不確定是否應該做類相同的類。我不會將這個元素作爲任何函數的參數,所以我猜不會。我通過typedef訪問結構。

using namespace std; 
    using namespace lulz; 

    int main(){ 

    Lista cabezalista; 
    Contacto Temp; 
    ContactPtr Cabeza; 
    string name, lastname; 
    int Choice; 
    ifstream entrada; 
    Opening(entrada); 

    Contacto<string> sexo; 

    while(!entrada.eof()) 
    { 
    entrada >> Temp; 
    cabezalista.InsertContact(Cabeza,Temp); 
    } 

在文件中包含從main.cpp中:1:
Proyecto.h:27:錯誤:預期初始化之前 '*' 標記
Proyecto.h:35:錯誤: 'ContactPtr' 尚未聲明
Proyecto.h:37:錯誤: 'ContactPtr' 尚未聲明
Proyecto.h:37:錯誤: 'CONTACTO' 不是式
Proyecto.h:40:錯誤: 'ContactPtr' 還沒有已宣佈
Proyecto.h:42:錯誤:'ContactPtr'尚未聲明
Proyecto.h:44:error:'ContactPtr'has not been declared
Proyecto.h:47:error:'ContactPtr'does not named type
Proyecto.h:52:error:'Contacto'is not a鍵入
Proyecto.h:54:之前缺少模板參數 '溫度'

+0

歡迎堆棧溢出。請花些時間閱讀[The Tour](http://stackoverflow.com/tour),並參閱[幫助中心](http://stackoverflow.com/help/asking)中的資料,瞭解您可以在這裏問。 –

回答

0

I'm templating the struct, but unsure if should do the same for the class.

答案是, 「最有可能的是」:錯誤。

你的能夠使用

typedef Contacto* ContactPtr; 

,以避免Lista類模板的希望是基於模板是如何工作的不完全理解。正如你的編譯器已經指出的那樣,以上是無效的C++代碼。

Contact是一個類模板,而不是一個類。因此,您無法爲Contact*創建typedef。您可以使用:

template <typename T> 
using ContactPtr = Contacto<T>*; 

但是,你將不得不使用ContactPtr<T>其中T是一個有效的類型。

爲了能夠在Lista中使用ContactContactPtr,您將需要一個模板參數。模板參數可能會硬編碼爲已知類型,或者您可以使類模板成爲Lista。在後一種情況下,您可以使用Lista的模板參數來使用ContactoContactPtr

template <typename T> 
class Lista 
{ 
    ... 
    Contacto<T>* Cabeza; 
}; 

template <typename T> 
class Lista 
{ 
    ... 
    ContactPtr<T> Cabeza; 
};