View mode: basic / threaded / horizontal-split · Log in · Help
October 25, 2012
Proxy addition
From bug tracker I see that Proxy has a few issues, so this has 
likely been seen. But what would cause this error?

tmp/c.d(16): Error: overloads pure nothrow @safe double(auto ref 
CcRate b) and pure nothrow @safe double(auto ref CcRate b) both 
match argument list for opBinary

The error refers to two methods with the same signature. In 
typecons there are only two "Binary" methods, opBinary and 
opBinaryRight, both in Proxy, so where is the 
duplication/conflict coming from?

Thanks
Dan
---------------
import std.stdio;
import std.typecons;
import std.algorithm;

struct CcRate {
  private double rate = 0;
  mixin Proxy!rate;

  this(double rate) {
    this.rate = rate;
  }
}

unittest {
    CcRate r1 = 0.033, r2 = 0.002;
    writeln(r1+r2);  // compile error
}
---------------
October 26, 2012
Re: Proxy addition
On Thursday, 25 October 2012 at 16:39:57 UTC, Dan wrote:
> From bug tracker I see that Proxy has a few issues, so this has 
> likely been seen. But what would cause this error?
>
> tmp/c.d(16): Error: overloads pure nothrow @safe double(auto 
> ref CcRate b) and pure nothrow @safe double(auto ref CcRate b) 
> both match argument list for opBinary
>
> The error refers to two methods with the same signature. In 
> typecons there are only two "Binary" methods, opBinary and 
> opBinaryRight, both in Proxy, so where is the 
> duplication/conflict coming from?
>
> Thanks
> Dan
> ---------------
> import std.stdio;
> import std.typecons;
> import std.algorithm;
>
> struct CcRate {
>   private double rate = 0;
>   mixin Proxy!rate;
>
>   this(double rate) {
>     this.rate = rate;
>   }
> }
>
> unittest {
>     CcRate r1 = 0.033, r2 = 0.002;
>     writeln(r1+r2);  // compile error
> }
> ---------------

Still trying to understand this. I found that if I change the 
following in Proxy it this example (r1 + r2) works fine. Plus the 
unit tests that are there still work. But, honestly I don't 
understand why...yet.

Thanks,
Dan

----- From typecons.Proxy -----
    auto ref opBinary     (string op, this X, B)(auto ref B b) { 
return mixin("a "~op~" b"); }
----- To -----
    auto ref opBinary     (string op, this X, B)(auto ref B b) 
if(!is(X == B)) { return mixin("a "~op~" b"); }
-----
October 26, 2012
Re: Proxy addition
On Friday, 26 October 2012 at 15:14:56 UTC, Dan wrote:
> Still trying to understand this. I found that if I change the 
> following in Proxy it this example (r1 + r2) works fine. Plus 
> the unit tests that are there still work. But, honestly I don't 
> understand why...yet.
>
> Thanks,
> Dan
>
> ----- From typecons.Proxy -----
>     auto ref opBinary     (string op, this X, B)(auto ref B b) 
> { return mixin("a "~op~" b"); }
> ----- To -----
>     auto ref opBinary     (string op, this X, B)(auto ref B b) 
> if(!is(X == B)) { return mixin("a "~op~" b"); }
> -----

From http://dlang.org/operatoroverloading.html, it is an error 
for both overloads of opBinary (opBinary and opBinaryRight) to 
match. Since the signatures for the two overloads in std.typecons 
are identical, this looks like a bug to me.

Your modified version works (far as I can see) because it 
excludes one of the overloads from being matched, allowing the 
other to be used (opBinaryRight).
Top | Discussion index | About this forum | D home