Bug 2889 – Alias this properties don't overload with non-alias this properties.

Status
RESOLVED
Resolution
INVALID
Severity
normal
Priority
P2
Component
dmd
Product
D
Version
D2
Platform
All
OS
All
Creation time
2009-04-24T15:56:00Z
Last change time
2015-06-09T01:26:26Z
Keywords
rejects-valid
Assigned to
nobody
Creator
dsimcha

Comments

Comment #0 by dsimcha — 2009-04-24T15:56:01Z
struct ArrayWrapper { uint[] arr; alias arr this; void length(uint l) {}; } void main() { ArrayWrapper aw; auto len = aw.length; } Errors: C:\home\dsimcha\bin\test.d(10): Error: function test.ArrayWrapper.length (uint l) does not match parameter types () C:\home\dsimcha\bin\test.d(10): Error: expected 1 function arguments, not 0 C:\home\dsimcha\bin\test.d(10): Error: variable test.main.len voids have no value C:\home\dsimcha\bin\test.d(10): Error: expression aw.length() is void and has no value If I comment out the length property in the ArrayWrapper struct, length gets forwarded properly to arr and the code compiles.
Comment #1 by hoganmeier — 2011-08-14T15:01:37Z
This is also critical for proper simulation of struct inheritance.
Comment #2 by k.hara.pg — 2011-08-14T15:30:58Z
I think this is a language design, not a bug. In normal class inheritance, derived class method doesn't overload with base class methods that have same names. class Array // the synonym of uint[] { size_t length(){ return 0; } void length(size_t n){ } // built-in length property (getter and setter) } class ArrayWrapper : Array { void length(uint l) {} // length overrides Array.length, not overloads }
Comment #3 by hoganmeier — 2011-11-03T04:04:51Z
Yeah, you're right. See http://www.digitalmars.com/d/2.0/hijack.html for the rationale. Overloading is done explicitly with alias just like you use using in C++ for this purpose. Unfortunately you can't alias arr.length length; in this particular case though: Error: alias test.ArrayWrapper.length cannot alias an expression arr.length The only option is to use a small function that wraps arr.length I guess.