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.