Thread overview
opEquals on shared object
Jun 30, 2016
jj75607
Jun 30, 2016
jj75607
June 30, 2016
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?
June 30, 2016
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
June 30, 2016
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))
June 30, 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