创建一个模板,该模板是具有多个变量的自定义数据类型的向量

时间:2013-04-11 11:39:57

标签: c++ templates vector stl

我必须能够使用下面的命令,其中T可以是任何类型,例如string。

Counter<T> counter;  

计数器应该能够容纳多个项目,所以我选择将其作为向量来实现。每个项目本身必须包含一个类型为T的变量(如果我们继续上面的例子,则为字符串)和一个int。我需要尽可能简化解决方案,因为稍后我将需要创建通过在其他任务中降低int值来打印每个项目的函数。我已经使用了以下代码,但1)它不起作用2)有更好的解决方案吗?

#include<string>
#include<cstdlib>
#include<vector>

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};


class Counter{
      vector<Record> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}

4 个答案:

答案 0 :(得分:2)

你弄错了,你需要Counter可参数化:

template <typename T>
class Counter{
      vector<Record<T> > data;
};

当然,这意味着您counter中的所有记录都将包含字符串。

如果“Counter应该能够容纳多个项目”真的意味着Counter的一个实例应该包含各种类型或记录(例如字符串和整数),那么你需要使用VARIANT之类的东西或boost::anyboost::variant或类似的东西,具体取决于您使用的要求和技术,例如

Counter<boost::any> counter;

答案 1 :(得分:2)

你的程序包含一些错误,如下所述。

次要问题:

首先,一件小事:你不需要包含<cstdlib>标题 - 至少不是你所展示的内容。

#include<string>
// #include<cstdlib> // <== (YOU DON'T SEEM TO NEED THIS)
#include<vector>

第一个问题:

如果使用非限定名称来引用位于命名空间中的对象,则应首先使用using声明,使编译器将这些非限定名称解析为正确的完全限定名称(即包括它们所属的命名空间)到)。

例如,vectorstring属于std命名空间。因此,要么以完全限定的形式(std::vectorstd::string)使用这些名称,要么添加正确的using声明,如下所示:

using std::vector; // USING DECLARATIONS TO ALLOW UNQUALIFIED NAMES SUCH AS
using std::string; // string AND vector TO BE CORRECTLY RESOLVED

第二个问题:

最后,您想要的是使您的类Counter参数化,并且该参数应该用于实例化内部vector。因此,Counter也必须是一个类模板(毕竟,这就是你在main()函数中使用它的方式):

// MAKE THIS A CLASS TEMPLATE!
template<typename T>
class Counter{
      vector<Record<T>> data;
};

<强>结论:

完成上述所有更正后,您的代码应如下所示:

#include<string>
#include<vector>

using std::vector;
using std::string;

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<typename T>
class Counter{
      vector<Record<T>> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}

这是一个显示上面代码片段的live example

答案 2 :(得分:0)

我认为你打算这样做:

template<class T>
class Record{
      T itemtype;
      int total;   
   public:
      int increment(T item);
      int count(T item);
      void printSummary();
};

template<class RECORDTYPE>
class Counter{
      vector<Record<RECORDTYPE>> data;
};

int main(){

   Counter<string> counter;   

   return 0;
}

答案 3 :(得分:0)

Record是一个模板,所以你不能只有vector<Record>你必须有一个记录类型的向量,即vector<Record<T> >