考虑下面的基类:
template <typename T>
class food {
public:
T quantity;
};
现在使用不同的模板实例派生两个类:
class cheese: public food<float> {
}
class chocolate: public food<int> {
}
在主要功能中,我需要创建一个“食物”列表。实例
int main () {
vector<food*> bucket;
}
因为我不知道什么样的食物会被扔进桶里。但是,编译此代码会产生错误:
error: missing template arguments before ‘*’ token
因此,我该怎么办呢?
现在我需要为派生类定义成员函数:
class cheese: public food<float> {
float get_q() {return quantity};
}
class chocolate: public food<int> {
int get_q() {return quantity};
}
问题是,如果我打电话,编译器会说class food没有成员get_q:
bucket.push_back(new cheese);
bucket.push_back(new chocolate);
bucket[0]->get_q();
在main中,即使我像这样更改Quantity接口
template <typename T>
class Quantity{
public:
T quantity;
virtual T get_q() = 0;
};
编译器确实需要查看get_q()
中定义的food
,但如果food
不是模板,则无法做到这一点,对吗?
抱歉,我是一名新的C ++程序员,很多事情对我来说都不清楚......
答案 0 :(得分:2)
food<float>
和food<int>
是不同的类型,不能像使用多态一样使用它们。
food*
没有命名类型,因为模板需要一个参数(这是编译器告诉你的)
要么为所有food<>
类型提供公共基础(如果类型确实相关,您可能需要它们),或者您需要某种类型的擦除包装,例如boost::any
或boost::variant
boost::any
示例:
#include <vector>
#include <boost/any.hpp>
template <typename T>
class food {
public:
T quantity;
};
class cheese: public food<float> {
};
class cholocate: public food<int> {
};
int main()
{
std::vector<boost::any> v;
v.push_back(food<float>());
v.push_back(food<int>());
}
答案 1 :(得分:1)
您可以创建一个不是类模板的基类food
,并创建一个捕获数量的类模板。
class food
{
};
template <typename T>
class Quantity{
public:
T quantity;
};
class cheese: public food, public Quantity<float> {
};
class cholocate: public food, public Quantity<int> {
};
int main()
{
std::vector<food*> v;
v.push_back(new cheese);
v.push_back(new cholocate);
}
更新,作为对OP的回复评论,需要添加
您可以添加get_quantity()
功能,例如:
class food
{
public:
virtual float get_quantity() const = 0;
};
class cheese: public food, public Quantity<float> {
public:
virtual float get_quantity() const
{
return this->quantity;
}
};
class cholocate: public food, public Quantity<int> {
public:
virtual float get_quantity() const
{
return this->quantity; // Implicit conversion to float.
}
};