导出类对象传染媒介用不同的模板的

时间:2014-08-25 10:26:54

标签: c++ templates vector

考虑下面的基类:

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 ++程序员,很多事情对我来说都不清楚......

2 个答案:

答案 0 :(得分:2)

  • food<float>food<int>是不同的类型,不能像使用多态一样使用它们。

  • food*没有命名类型,因为模板需要一个参数(这是编译器告诉你的)

要么为所有food<>类型提供公共基础(如果类型确实相关,您可能需要它们),或者您需要某种类型的擦除包装,例如boost::anyboost::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.
      }
};