C++ 模板类的向量?

C++ 模板类的向量?,c++,templates,vector,C++,Templates,Vector,我的一小部分代码有问题,我正在尝试使用模板和模板类的向量 一位朋友帮我编写了以下代码,使其达到可编译的状态,但我仍然不能很好地使用派生类,因此我完全迷失了方向,无法克服这个小错误,我真的需要您的帮助 #include <iostream> #include <vector> class data_base { public: data_base( std::string &_id ); std:

我的一小部分代码有问题,我正在尝试使用模板和模板类的向量
一位朋友帮我编写了以下代码,使其达到可编译的状态,但我仍然不能很好地使用派生类,因此我完全迷失了方向,无法克服这个小错误,我真的需要您的帮助

   #include <iostream>
   #include <vector>

   class data_base
   {
   public:
         data_base( std::string &_id );

         std::string id;
   };

   template <typename T>
   class data : public data_base
   {
   public:
         data<T>( T &_data, std::string &_id );

         T *data;
   };

   data_base::data_base( std::string &_id )
   {
         id = _id;
   }

   template <typename T>
   data<T>::data( T &_data, std::string &_id )
   {
        data =& _data;
        id = _id;
   }


   int main()
   {
       std::vector< data_base*> stuff;

       return 0;
  }
#包括
#包括
类数据库
{
公众:
数据库(标准::字符串和id);
std::字符串id;
};
模板
类数据:公共数据库
{
公众:
数据(T和u数据,std::string和u id);
T*数据;
};
数据库::数据库(标准::字符串和id)
{
id=_id;
}
模板
数据::数据(T和U数据,std::字符串和id)
{
数据=&_数据;
id=_id;
}
int main()
{
std::vectorstuff;
返回0;
}
如何使用数据类并将其放入stuff vector中,然后再访问它?
哦,如果有人知道一个关于使用基类/派生类的好教程,我真的可以使用它
提前谢谢

如何使用数据类并将其放入stuff vector中,然后访问它

其实很简单。让我们完成一些步骤

若要创建模板化数据类的单个实例,请在尖括号中声明要使用的类型:

data<int> MyDataObject(0, "zero");
你明白逻辑吗

但是,有一个问题:这不会编译在大多数C++编译器上,但这不是因为你犯了一个逻辑错误。因为在结尾的<代码> > /COD>不被看作是类型声明的一部分——它被看作是另外的东西(>>还有另一个意思。我相信这个问题在这个情况下是在最新的C++规范中被固定的)。要解决这个问题,就要强制编译器通过添加一个空间来正确解析它:

std::vector<data<int> > MyVector;
请注意,
MyDataObject
MyVector
都是在堆栈上分配的,因此当它们超出范围(声明每个对象的方法或块-一个块是
{…}
节-结束)时,它们将被销毁。您还可以在堆上分配,并在向量中存储指向基本对象的指针。如果你想知道如何做到这一点,请评论-我可以扩展答案

哦,如果有人知道一个关于使用基类/派生类的好教程,我真的可以使用它

请每个问题只问一个问题。这有助于保持网站的组织性。此外,与你的第一个问题不同,我认为这是一个你可以很容易研究自己的东西。但是如果你有困难,请随意在这里问另一个问题

但这里有一个明显的错误。数据代码(派生类)具有以下构造函数:

template <typename T>
   data<T>::data( T &_data, std::string &_id )
   {
        data =& _data;
        id = _id;
   }
构造函数中a:之后的项是“初始化列表”。事实上,你可以把一切都放在那里:

template <typename T>
data<T>::data( T &_data, std::string &_id ) :
     data_base(id), // call parent constructor
     data(_data)
{ }

并将声明更改为匹配(并以类似方式更改基类)。尝试命名对象,以便至少可以区分类型、局部变量和成员变量。

database
似乎毫无用处,因为它没有虚拟函数。您是否正在尝试重新实现
boost::any
?我正在使用此代码的一部分,在我的序列化代码的旧版本中,我最近决定将其更改为与模板兼容,但无法使其正常工作。有没有一种方法可以完全忽略基类/派生类,并以任何可能的方式跳到一个模板类向量?
template <typename T>
   data<T>::data( T &_data, std::string &_id )
   {
        data =& _data;
        id = _id;
   }
template <typename T>
data<T>::data( T &_data, std::string &_id ) :
     data_base(id) // call parent constructor
{
     data =& _data;
}
template <typename T>
data<T>::data( T &_data, std::string &_id ) :
     data_base(id), // call parent constructor
     data(_data)
{ }
template <typename T>
data<T>::data(T &data, std::string &id) :
     data_base(id), // call parent constructor
     m_data(data)
{ }