1

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

Counter<T> counter;  

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

4 回答 4

2

你错了,你需要使Counter参数化:

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

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

如果“计数器应该能够容纳多个项目”真的意味着一个实例Counter应该包含各种类型或记录(例如字符串和整数),那么您需要根据您的要求和技术使用类似VARIANTboost::any或类似的东西boost::variant使用,例如

Counter<boost::any> counter;
于 2013-04-11T11:42:57.037 回答
2

您的程序包含一些错误,如下所示。

小问题:

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

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

第一个问题:

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

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

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

第二个问题:

最后,您想要的是使您的类Counter参数化,并且该参数应该用于实例化 internal 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;
}

这是一个显示上述代码编译的实时示例。

于 2013-04-11T11:44:07.953 回答
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;
}
于 2013-04-11T11:43:41.480 回答
0

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

于 2013-04-11T11:45:29.947 回答