试图让模板在c ++中用于结构元素

时间:2017-05-31 20:47:14

标签: c++ class templates struct

这是我第一次使用模板。我仅将模板用于结构的元素。

    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:错误:'ContactPtr'尚未声明为
Proyecto.h:47:错误:'ContactPtr'没有命名类型
Proyecto.h:52:错误:'Contacto'不是类型
Proyecto.h:54:错误:在'Temp'之前缺少模板参数

1 个答案:

答案 0 :(得分:0)

  

我模仿结构,但不确定是否应该为该类做同样的事情。

答案是,&#34;很可能是&#34;。

您希望能够使用

typedef Contacto* ContactPtr;

以避免使Lista类模板基于对模板如何工作的不完全理解。上面的代码不是有效的C ++代码,正如您的编译器指出的那样。

Contact是一个类模板,而不是一个类。因此,您无法为typedef创建Contact*。您可以使用:

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

但是,您必须使用ContactPtr<T>,其中T是有效类型。

为了能够在Contact中使用ContactPtrLista,您需要一个模板参数。模板参数可以硬编码为已知类型,也可以使Lista成为类模板。在后一种情况下,您可以使用Lista的模板参数来使用ContactoContactPtr

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

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