opEquals on shared object
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?
Re: opEquals on shared object
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
Re: opEquals on shared object
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))
Re: opEquals on shared object
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