No subclass member loopup in derived class, bug?

Jonathan M Davis jmdavisProg at gmx.com
Tue Mar 26 18:34:47 PDT 2013


On Tuesday, March 26, 2013 17:24:20 Ali Çehreli wrote:
> On 03/26/2013 04:58 PM, Henning Pohl wrote:
> > struct S {
> > int value() {
> > return 1;
> > }
> > }
> > 
> > class Base {
> > S s;
> > alias s this;
> > }
> > 
> > class Derived : Base {
> > void func() {
> > int i = value();
> > }
> > }
> > 
> > Fails with "main.d(14): Error: undefined identifier value".
> > Explicitly casting this to Base works:
> > 
> > void func() {
> > int i = (cast(Base)this).value();
> > }
> > 
> > Is this intended or a bug?
> 
> Since alias this is for implicit conversions, it should be effective
> only when Base is used as an S. It is not obvious in the previous code
> that the programmer really wanted that.
> 
> I like the current behavior. I wonder what others think.

We should be extremely careful with implicit conversions. They can be useful, 
but it makes it _very_ easy to cause bugs (particularly with regards to 
templates where it can easily become the case that something passes a template 
constraint due to an implicit conversion but fails to actually work with the 
function).

I don't know what the intended behavior here is, but since we already have 
cases like having to alias base class functions in derived classes when they 
were overloaded or not be able to call the base class overload, it doesn't 
surprise me at all that it would work this way.

- Jonathan M Davis


More information about the Digitalmars-d-learn mailing list