首页 > 后端开发 > C++ > 正文

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

Barbara Streisand
发布: 2024-10-30 08:23:27
原创
275 人浏览过

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中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责声明 Sitemap
PHP中文网:公益在线PHP培训,帮助PHP学习者快速成长!