首页  >  文章  >  后端开发  >  为什么我不能将“Container”传递给需要“Container”的构造函数?

为什么我不能将“Container”传递给需要“Container”的构造函数?

Barbara Streisand
Barbara Streisand原创
2024-10-30 08:23:27268浏览

Why Can't I Pass a `Container` to a Constructor Expecting `Container`?

模板多态性:当模板发挥不佳时

在 C 中,模板为泛型编程提供了强大的机制。然而,它们的多态行为存在局限性。本文回答了特定场景下模板多态性缺失的问题。

查询

用户在调用构造函数时遇到“无匹配函数”错误它采用 Container& 类型的参数。构造函数在 Bar 类中定义,用户创建 Container 的实例。

深入研究多态性

多态性允许不同类的对象被视为公共基类的对象。但是,此行为不会扩展到 C 中的模板。尽管 Foo 派生自 Interface,但它不会自动使 Container 成为 Container。需要 Container 的构造函数的有效参数。

模板的非协方差

这里的关键方面是缺乏模板协方差。在协变模板中,派生类型会自动被视为需要其基类型的模板的有效参数。然而,在 C 中,模板不是协变的。

协变的后果

考虑以下示例:

class Fruit {...};
class Apple : public Fruit {...};
class Orange : public Fruit {...};
std::vector<Apple>& apple_vec; // Vector of apples
std::vector<Fruit>& fruit_vec = apple_vec; // Assignment allowed
fruit_vec.push_back(Orange()); // Oops, added an orange to the apple vector!

正如解释所指出的,协变处理模板可能会导致应不兼容的类型被视为兼容的情况,从而破坏类型安全。

替代解决方案

因为不支持协变模板C,需要采用替代解决方案。静态断言或有界通配符(在 Java 中可用)可用于强制执行所需的类型关系。在查询中提到的具体场景中,一个简单的静态断言就可以验证传入的Container类型确实是Container

以上是为什么我不能将“Container”传递给需要“Container”的构造函数?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn