digitalmars.D.learn - Implicit conversion from class in parent class fails?
- Namespace (56/56) Jun 16 2012 Why work this:
- Andrew Wiley (26/72) Jun 16 2012 The problem is that this would also work:
- =?UTF-8?B?QWxpIMOHZWhyZWxp?= (30/122) Jun 16 2012 The following is a shorter example, which happens to also produce a more...
Why work this:
[code]
class Foo { }
class Bar : Foo { }
class Quatz : Bar { }
void foo(Foo f) {
}
void main() {
Foo f = new Foo();
Foo f2;
foo(f);
foo(f2);
Bar b = new Bar();
Bar b2;
foo(b);
foo(b2);
Quatz q = new Quatz();
Quatz q2;
foo(q);
foo(q2);
}
[/code]
but not:
[code]
import std.stdio;
class Foo { }
class Bar : Foo { }
class Quatz : Bar { }
void bar(Foo[] fs) {
}
void main() {
Foo[] fs = [new Foo()];
Foo[] fs2;
bar(fs);
bar(fs2);
Bar[] bs = [new Bar()];
Bar[] bs2;
bar(bs);
bar(bs2);
Quatz[] qs = [new Quatz()];
Quatz[] qs2;
bar(qs);
bar(qs2);
}
[/code]
I think that should work also.
Jun 16 2012
On Sat, Jun 16, 2012 at 11:52 AM, Namespace <rswhite4 googlemail.com> wrote=
:
Why work this:
[code]
class Foo { }
class Bar : Foo { }
class Quatz : Bar { }
void foo(Foo f) {
}
void main() {
=A0 =A0 =A0 =A0Foo f =3D new Foo();
=A0 =A0 =A0 =A0Foo f2;
=A0 =A0 =A0 =A0foo(f);
=A0 =A0 =A0 =A0foo(f2);
=A0 =A0 =A0 =A0Bar b =3D new Bar();
=A0 =A0 =A0 =A0Bar b2;
=A0 =A0 =A0 =A0foo(b);
=A0 =A0 =A0 =A0foo(b2);
=A0 =A0 =A0 =A0Quatz q =3D new Quatz();
=A0 =A0 =A0 =A0Quatz q2;
=A0 =A0 =A0 =A0foo(q);
=A0 =A0 =A0 =A0foo(q2);
}
[/code]
but not:
[code]
import std.stdio;
class Foo { }
class Bar : Foo { }
class Quatz : Bar { }
void bar(Foo[] fs) {
}
void main() {
=A0 =A0 =A0 =A0Foo[] fs =3D [new Foo()];
=A0 =A0 =A0 =A0Foo[] fs2;
=A0 =A0 =A0 =A0bar(fs);
=A0 =A0 =A0 =A0bar(fs2);
=A0 =A0 =A0 =A0Bar[] bs =3D [new Bar()];
=A0 =A0 =A0 =A0Bar[] bs2;
=A0 =A0 =A0 =A0bar(bs);
=A0 =A0 =A0 =A0bar(bs2);
=A0 =A0 =A0 =A0Quatz[] qs =3D [new Quatz()];
=A0 =A0 =A0 =A0Quatz[] qs2;
=A0 =A0 =A0 =A0bar(qs);
=A0 =A0 =A0 =A0bar(qs2);
}
[/code]
I think that should work also.
The problem is that this would also work:
[code]
import std.stdio;
class Foo { }
class Bar : Foo { }
class Quatz : Bar { }
void bar(Foo[] fs) {
fs[0] =3D new Foo(); // <-- OH NOES
}
void main() {
Foo[] fs =3D [new Foo()];
Foo[] fs2;
bar(fs);
bar(fs2);
Bar[] bs =3D [new Bar()];
Bar[] bs2;
bar(bs);
bar(bs2);
Quatz[] qs =3D [new Quatz()];
Quatz[] qs2;
bar(qs);
bar(qs2);
}
[/code]
Jun 16 2012
On 06/16/2012 11:55 AM, Andrew Wiley wrote:On Sat, Jun 16, 2012 at 11:52 AM, Namespace<rswhite4 googlemail.com> wrote:The following is a shorter example, which happens to also produce a more educating error message: import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void zar(ref Foo fs) {// <-- ref fs = new Quatz(); // <-- OH NOES } void main() { auto b = new Bar(); zar(b); // <-- Error: cast(Foo)b is not an lvalue } After all of the above, a const reference works as Namespace expects: import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void zar(const Foo[] fs) { // <-- const makes it work // ... } void main() { zar([ new Bar() ]); } Ali -- D Programming Language Tutorial: http://ddili.org/ders/d.en/index.htmlWhy work this: [code] class Foo { } class Bar : Foo { } class Quatz : Bar { } void foo(Foo f) { } void main() { Foo f = new Foo(); Foo f2; foo(f); foo(f2); Bar b = new Bar(); Bar b2; foo(b); foo(b2); Quatz q = new Quatz(); Quatz q2; foo(q); foo(q2); } [/code] but not: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { } void main() { Foo[] fs = [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs = [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs = [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code] I think that should work also.The problem is that this would also work: [code] import std.stdio; class Foo { } class Bar : Foo { } class Quatz : Bar { } void bar(Foo[] fs) { fs[0] = new Foo(); //<-- OH NOES } void main() { Foo[] fs = [new Foo()]; Foo[] fs2; bar(fs); bar(fs2); Bar[] bs = [new Bar()]; Bar[] bs2; bar(bs); bar(bs2); Quatz[] qs = [new Quatz()]; Quatz[] qs2; bar(qs); bar(qs2); } [/code]
Jun 16 2012








=?UTF-8?B?QWxpIMOHZWhyZWxp?= <acehreli yahoo.com>