【发布时间】:2021-02-26 17:05:27
【问题描述】:
在下面的代码中,我在尝试将 fooBaz 推送到 v 时遇到编译器错误。这让我感到惊讶,因为Baz 是Bar 的派生类。
为什么不允许这样做,如果想将多个 Foo 实例(模板化于从同一基类派生的类上)放入向量中,我该怎么办?
#include <iostream>
#include <vector>
template<typename T>
class Foo {};
struct Bar {};
struct Baz : public Bar {};
int main() {
Foo<Bar> fooBar;
Foo<Baz> fooBaz;
std::vector<Foo<Bar>> v;
v.push_back(fooBar);
v.push_back(fooBaz);
return 0;
}
【问题讨论】:
-
“这让我很惊讶,因为 Baz 是 Bar 的派生类” - 但是
Foo<Baz>不是Foo<Bar>的派生类。 -
Foo<Bar>和Foo<Baz>是完全不相关的类,为什么你会期望std::vector<T>可以包含混合类型,除非这些是指向virtually 继承类的指针或引用 -
打个冷却类比:类模板是一个食谱,其中模板参数是成分。换了食材,就换了菜,不希望在同一个碗里放不同的菜。
-
哈哈,好比喻内森。谢谢大家的回答,很有帮助。
-
Java 程序员?
标签: c++ templates generics polymorphism