【发布时间】:2014-08-25 10:26:53
【问题描述】:
考虑下面的基类:
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 界面
template <typename T>
class Quantity{
public:
T quantity;
virtual T get_q() = 0;
};
看来编译器确实需要查看food 中定义的get_q(),但如果food 不是模板,那是不可能的,对吧?
对不起,我是一个新的 C++ 程序员,很多事情对我来说不是很清楚......
【问题讨论】:
-
模板参数是类型的一部分,所以它是不可能的。不过,您也许可以通过Boost Any 解决它。
-
是的,boost::any 是不错的选择。
-
感谢大家的解决方案。我真的需要在没有 Boost 库的情况下编写代码。在@RSahu 的解决方案中,似乎我必须在“food”类中虚拟定义派生类的所有成员函数,否则编译器会在编译时说该函数不是“food”的成员。跨度>