template mixin bug?

Matti Niemenmaa see_signature at for.real.address
Tue Nov 13 07:50:57 PST 2007


Simen Haugen wrote:
> I have a mixin like this:
> template M() {
>  int i() {
>   return _i;
>  }
> 
>  private:
>  int _i;
> }
> 
> But if I try to add a setter function to my class that uses the mixin, the 
> compiler gets confused (seems like its hiding the mixed in function):
> class C {
>  mixin Mixin;
>  void i(int a) {
>   _i = a;
>  }
> }
> 
> void main() {
>  C c = new C;
>  c.i = 12;
>  assert(c.i == 12);
> }
> 
> Now it fails to compile if I try to use the get method from the mixin. If I 
> don't use the method, it compiles.
> 
> t.d(29): function test.C.i (int) does not match parameter types ()
> t.d(29): Error: expected 1 arguments, not 0
> t.d(29): Error: void has no value
> t.d(29): Error: incompatible types for (((c.i)()) == (12)): 'void' and 'int'
> 
> Is there a reason I cannot do this, or is it a compiler bug? I'm using dmd 
> 1.023. 

http://digitalmars.com/d/1.0/template-mixin.html

"If the name of a declaration in a mixin is the same as a declaration in the
surrounding scope, the surrounding declaration overrides the mixin one".

This means that your void i overrides the mixed-in i and, as you say, the
mixed-in function is hidden.

The page also mentions a workaround: "If a mixin has a MixinIdentifier, it can
be used to disambiguate". You'll find the following works:

class C {
 mixin M Foo;
 alias Foo.i i;
 void i(int a) {
  _i = a;
 }
}

-- 
E-mail address: matti.niemenmaa+news, domain is iki (DOT) fi



More information about the Digitalmars-d mailing list