我必须能够使用下面的命令,其中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;
}
答案 0 :(得分:2)
你弄错了,你需要Counter
可参数化:
template <typename T>
class Counter{
vector<Record<T> > data;
};
当然,这意味着您counter
中的所有记录都将包含字符串。
如果“Counter应该能够容纳多个项目”真的意味着Counter
的一个实例应该包含各种类型或记录(例如字符串和整数),那么你需要使用VARIANT
之类的东西或boost::any
或boost::variant
或类似的东西,具体取决于您使用的要求和技术,例如
Counter<boost::any> counter;
答案 1 :(得分:2)
你的程序包含一些错误,如下所述。
次要问题:
首先,一件小事:你不需要包含<cstdlib>
标题 - 至少不是你所展示的内容。
#include<string>
// #include<cstdlib> // <== (YOU DON'T SEEM TO NEED THIS)
#include<vector>
第一个问题:
如果使用非限定名称来引用位于命名空间中的对象,则应首先使用using
声明,使编译器将这些非限定名称解析为正确的完全限定名称(即包括它们所属的命名空间)到)。
例如,vector
和string
属于std
命名空间。因此,要么以完全限定的形式(std::vector
和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
参数化,并且该参数应该用于实例化内部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> >