Thread overview | ||||||
---|---|---|---|---|---|---|
|
June 30, 2016 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? |
June 30, 2016 Re: opEquals on shared object | ||||
---|---|---|---|---|
| ||||
Posted in reply to jj75607 | 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 Re: opEquals on shared object | ||||
---|---|---|---|---|
| ||||
Posted in reply to Steven Schveighoffer | 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 Re: opEquals on shared object | ||||
---|---|---|---|---|
| ||||
Posted in reply to jj75607 | 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
|
Copyright © 1999-2021 by the D Language Foundation