Thread overview | ||||||||
---|---|---|---|---|---|---|---|---|
|
April 29, 2014 private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
//blah1.d class A { private this(){} } //blah2.d import blah1; class B : A {} $ dmd blah1.d blah2.d -lib Error: constructor blah1.A.this is not accessible from module blah2 Can someone explain why this can't/doesn't work? Thanks. |
April 29, 2014 Re: private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | On Tuesday, 29 April 2014 at 13:59:30 UTC, John Colvin wrote:
> //blah1.d
>
> class A
> {
> private this(){}
> }
>
>
> //blah2.d
>
> import blah1;
>
> class B : A {}
>
>
> $ dmd blah1.d blah2.d -lib
> Error: constructor blah1.A.this is not accessible from module blah2
>
> Can someone explain why this can't/doesn't work? Thanks.
Also, I noticed that adding a blank constructor ( this(){} ) to B didn't help, but adding a blank template constructor ( this()(){} ) makes the error go away.
|
April 29, 2014 Re: private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin | http://dlang.org/class.html#constructors "If no call to constructors via this or super appear in a constructor, and the base class has a constructor, a call to super() is inserted at the beginning of the constructor." The fact that call to base constructor is not inserted into templated this()() looks like a bug to me. |
April 29, 2014 Re: private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to Dicebot | On 4/29/14, Dicebot via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > The fact that call to base constructor is not inserted into > templated this()() looks like a bug to me. Just found this, and it might be related: https://issues.dlang.org/show_bug.cgi?id=5770 |
April 29, 2014 Re: private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to John Colvin Attachments: | On Tue, 29 Apr 2014 13:59:28 +0000 John Colvin via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com> wrote: > Can someone explain why this can't/doesn't work? Thanks. hm. why it should? there is no 'default' constructors in D, and you specifially made explicit one private (i.e. not visible outside the module). and adding constructor to B inherits 'private' (not sure if it is right though). but templated one generates constructor code 'on demand', w/o 'private'. i think that public constructor in B should work, so this may be bug. will wait for somebody more expirienced in language to jump in before filling bug report though. |
April 29, 2014 Re: private constructors and inheritance | ||||
---|---|---|---|---|
| ||||
Posted in reply to ketmar | On Tuesday, 29 April 2014 at 18:51:15 UTC, ketmar via Digitalmars-d-learn wrote:
> On Tue, 29 Apr 2014 13:59:28 +0000
> John Colvin via Digitalmars-d-learn <digitalmars-d-learn@puremagic.com>
> wrote:
>> Can someone explain why this can't/doesn't work? Thanks.
> hm. why it should? there is no 'default' constructors in D, and you
> specifially made explicit one private (i.e. not visible outside the
> module). and adding constructor to B inherits 'private' (not sure if it
> is right though). but templated one generates constructor code 'on
> demand', w/o 'private'.
>
> i think that public constructor in B should work, so this may be bug.
> will wait for somebody more expirienced in language to jump in before
> filling bug report though.
No it shouldn't. Private != protected. If A constructor is private, no one outside of same module can access it, not even B which is direct descendant.
|
Copyright © 1999-2021 by the D Language Foundation