gpt4 book ai didi

c++ - 具有不同模板的派生类对象的 vector

转载 作者:搜寻专家 更新时间:2023-10-31 01:43:17 25 4
gpt4 key购买 nike

考虑下面的基类:

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

问题是,如果我调用,编译器会说 food 类没有成员 get_q:

bucket.push_back(new cheese);
bucket.push_back(new chocolate);
bucket[0]->get_q();

在 main 中,即使我像这样更改 Quantity 接口(interface)

template <typename T>
class Quantity{
public:
T quantity;
virtual T get_q() = 0;
};

编译器似乎确实需要查看 food 中定义的 get_q(),但如果 food 不是模板,那是不可能的,对吧?

对不起,我是一个新的C++程序员,很多事情对我来说不是很清楚...

最佳答案

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

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

要么你为所有 food<> 提供一个公共(public)基础类型(如果类型确实相关,您可能需要它),或者您将需要某种类型的删除包装器,例如 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>());
}

关于c++ - 具有不同模板的派生类对象的 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25483842/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com