opEquals on shared object
Steven Schveighoffer via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Thu Jun 30 05:40:55 PDT 2016
On 6/30/16 8:30 AM, jj75607 wrote:
> On Thursday, 30 June 2016 at 12:21:03 UTC, Steven Schveighoffer wrote:
>> On 6/30/16 6:26 AM, jj75607 wrote:
>>> Hello!
>>>
>>> I need to overload opEquals on shared class C
>>>
>>> shared class C
>>> {
>>> override bool opEquals(Object o) { return false; }
>>> }
>>>
>>> But compilation fails with the message:
>>> Error: function f700.C.opEquals does not override any function, did you
>>> mean to override 'object.Object.opEquals'?
>>>
>>> What am I doing wrong?
>>
>> Object.opEquals is not marked shared. You can't override a non-shared
>> method with a shared one.
>>
>> You need to remove override.
>>
>> But... unfortunately, this may not work in practice. The opEquals
>> handling for objects is pretty much screwed unless you have unshared
>> mutable objects. I think it may work for const objects, but not in a
>> good way.
>>
>> -Steve
>
> Thanks!
>
> But what should I do to fix that code?
>
> shared class C
> {
> bool opEquals(Object o) { return false; }
> }
>
> class A(T)
> {
> void f(T a, T b)
> {
> if(a == b)
> writeln("equals");
> else
> writeln("non equals");
> }
> }
>
>
> int main(string[] argv)
> {
> auto a1 = new A!int;
> a1.f(1,2);
>
> auto a2 = new A!(shared(C));
> shared C c = new shared(C);
> a2.f(c,c);
>
>
> return 0;
> }
>
> It fails with
> Error: none of the overloads of 'opEquals' are callable using
> argument types (shared(C), shared(C))
This is an artifact of the object.opEquals entry point function. It
handles calling your object's opEquals properly.
Try changing C.opEquals to accept a shared(Object).
If that doesn't work, you may be out of luck until the druntime team
figures this out. Please file an issue if you can't get it to work.
-Steve
More information about the Digitalmars-d-learn
mailing list