2
|
Peter Smit · 技术社区 · 16 年前 |
![]() |
1
13
编译器不接受这一点的原因是标准告诉它不要这样做。
标准之所以不这样做,是因为委员会没有引入一条规则
标准委员会不想使这些类型相关的原因是,MyTemplate可能没有容器的语义。考虑:
那么通过一个
另外,假设
因为您的代码正在传递一个按值设置的值,所以您只需复制:
[编辑:您已将代码示例更改为不传递值。我的代码仍然有效,除了重构调用代码以使用
正在为编写包装
(*)实际上,我想它可以在写时复制,在以典型方式使用常量参数的情况下,这意味着它不需要进行复制。但是,在STL的实现中,copy-on-write有点不可信,即使我不怀疑委员会是否会要求如此重要的实现细节。 |
![]() |
2
2
如果你
这违反了里斯科夫替代原理。 这个特殊的问题也被称为 Covariance . 在这种情况下,如果函数参数是常量容器,那么 能够 被强迫去工作。如果参数容器是可变的,它就不能工作。 |
![]() |
3
2
先看看这里: Is array of derived same as array of base .在您的情况下,派生集与基集是完全不同的容器,并且由于没有隐式转换运算符可用于在它们之间转换,所以编译器给出了一个错误。 |
![]() |
4
2
|
![]() |
5
1
首先,似乎有点奇怪,你没有通过参考… 其次,正如另一篇文章中提到的,最好将传入集创建为std::set<base*>,然后为每个set成员在中新建派生类。 你的问题当然是因为这两种类型完全不同。就编译器而言,std::set<derived*>绝不从std::set<base*>继承。它们只是两种不同类型的集合… |
![]() |
6
0
好吧,正如你提到的问题所述,
|
![]() |
7
0
如您所知,一旦删除非常量操作,这两个类就非常相似。但是,C++中继承是类型的一个属性,而const仅仅是类型的限定符。这意味着你不能正确地陈述
此外,如果x不从y继承,这也适用于x和y的所有cv限定变体。这延伸到
|
![]() |
8
0
您完全正确地认为这是逻辑上允许的,但是它需要进一步的语言特性。如果您有兴趣了解其他语言的方式,可以在C 4.0中找到它们。请参见这里: http://community.bartdesmet.net/blogs/bart/archive/2009/04/13/c-4-0-feature-focus-part-4-generic-co-and-contra-variance-for-delegate-and-interface-types.aspx |
![]() |
9
0
没有看到它链接,所以这里有一个弹着点在C++ FAQ Lite相关的: http://www.parashift.com/c++-faq-lite/proper-inheritance.html#faq-21.3 我想他们的苹果袋!一袋水果的类比适合这个问题。 |
![]() |
Fernando Chu · 一个变量有多个可能的类?[关闭] 6 月前 |
![]() |
Amaterastis · 基类接受子类和内部子类的模板参数 7 月前 |
![]() |
Rishab Negi · 这个关键字在抽象类中是如何工作的 7 月前 |
![]() |
dEmigOd · 类层次结构中的运算符重载解析 7 月前 |
![]() |
TableTopRug · 如何从Kotlin中的密封类继承? 7 月前 |
![]() |
hasdrubal · 抽象基类函数指针python 11 月前 |
|
Josh · 通过反思访问孩子的财产 11 月前 |