Some strange parameter deduction problems in opOpAssign and opBinary

Ali Çehreli acehreli at yahoo.com
Sun Sep 2 00:41:52 PDT 2012


On 09/01/2012 10:08 PM, Ivan Agafonov wrote:
 > On Sunday, 2 September 2012 at 04:10:39 UTC, Ivan Agafonov wrote:
 >> There are 3 separated versions of opOpAssign
 >> first version must be the same as the second for Vec!(sometype, 4)
 >> why it doesn't work?
 >>
 >> Simplified code:
 >>
 >> struct Vec(T, uint size)
 >> {
 >> this(T rhs) { array[] = rhs; }
 >>
 >> // It doesn't work but compiles
 >> ref Vec!(T, size) opOpAssign(string op) (Vec!(T, size) rhs)
 >> {
 >> mixin("array[] "~op~"= rhs.array[];");
 >> return this;
 >> }
 >>
 >> // but it work's
 >> ref Vec!(T, 4) opOpAssign(string op) (Vec!(T, 4) rhs)
 >> {
 >> mixin("array[] "~op~"= rhs.array[];");
 >> return this;
 >> }
 >>
 >> // and this work;s
 >> ref Vec!(T, size) opAddAssign(Vec!(T, size) rhs)
 >> {
 >> array[] += rhs.array[];
 >> return this;
 >> }
 >>
 >> T[size] array = 0;
 >> }
 >>
 >> int main()
 >> {
 >> auto z = Vec!(float, 4)(5.0f);
 >> z += z;
 >> writeln(z);
 >> return 0;
 >> }
 >
 > Problem solved:
 >
 > alias Vec!(T, size) V;

You don't need the alias.

 > // This works fine
 > ref V opOpAssign(string op)(V rhs)
 > {
 > mixin("array[] "~op~"= rhs.array[];");
 > return this;
 > }

The name of the template alone becomes the actual instantiation of that 
template. This should work:

     ref Vec opOpAssign(string op) (Vec rhs)
     {
         mixin("array[] "~op~"= rhs.array[];");
         return this;
     }

 > But I think this is a bug.

Which compiler? All three versions of your original code compiles and 
produces the same result with dmd 2.060 under 64-bit Linux.

Ali



More information about the Digitalmars-d-learn mailing list