【问题标题】:Create a template that is a vector of a custom data type with multiple variables创建一个模板,该模板是具有多个变量的自定义数据类型的向量
【发布时间】:2013-04-11 11:39:57
【问题描述】:

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

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;
}

【问题讨论】:

  • 请解释一下“它不起作用”是什么意思。
  • 我们看不到 Record 的实现,而且您使用 Counter 作为模板类,但实际上 它不是模板,并且您没有为 Record 指定模板参数...
  • 计数器类也应该是模板。
  • @Drew Dormann $ g++ Counter2.h -o Counter2 Counter2.h:17:7: 错误:“向量”没有命名类型 Counter2.h:在函数“int main()”中: Counter2.h:22:4:错误:'Counter' 不是模板 Counter2.h:22:12:错误:'string' 未在此范围内声明 Counter2.h:22:12:注意:建议的替代方案:/ usr/lib/gcc/i686-redhat-linux/4.6.3/../../../../include/c++/4.6.3/bits/stringfwd.h:65:33:注意:'std ::字符串'

标签: c++ templates vector stl


【解决方案1】:

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

小问题:

首先,一件小事:您不需要包含 &lt;cstdlib&gt; 标头 - 至少对于您所显示的内容而言不是。

#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,显示上面的代码正在编译。

【讨论】:

  • 感谢您的详细回复。我将如何访问每个项目类型和总数?例如 if(Record.itemtype.count(item == 0){ Record.push_back(itemtype = item, Record.total = 1); }
  • @user1905552:与所有类一样,您需要该类的对象才能访问其成员。类模板也不例外。所以你不能做Record.itemtype,因为Record是一个类(模板)的名字,而不是一个对象的名字。但是,您可以这样做(Record&lt;string&gt; myRecord; myRecord.itemtype = 0; 等)
  • template&lt;class T&gt; int Counter &lt;T&gt; :: increment(T item){ if(data.count(data.itemtype == 0)){ data.push_back(data.itemtype = item, data.total = 1); }else{ for(int i=0; i &lt; data.size(data.itemtype); i++){ if(data[i].itemtype == item){ data[i].total = data[i].total + 1; break; } } } }我在这里做错了什么?
  • @user1905552: increment()Record 的成员函数,而不是 Counter 类模板的成员函数
  • 抱歉我把increment()移到Counter
【解决方案2】:

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

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

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

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

Counter<boost::any> counter;

【讨论】:

    【解决方案3】:

    我认为你的本意是:

    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;
    }
    

    【讨论】:

    • 谢谢,如果我在两个模板中都使用 T 会有什么不同吗?
    • 没关系,只是模板参数名。
    【解决方案4】:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-05-07
      • 2021-09-05
      • 2020-01-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多