Overriding opEquals in classes, for comparison with things that aren't Objects
Mike Parker via Digitalmars-d-learn
digitalmars-d-learn at puremagic.com
Fri Jan 29 07:13:45 PST 2016
On Friday, 29 January 2016 at 15:00:59 UTC, pineapple wrote:
> With this bit of code, the first method seems to work fine -
> things go as expected. But I get a compile error with the
> second method, and I'm not sure how else to write this.
>
> override bool opEquals(Object value) const{
> return this.equals(cast(typeof(this)) value);
> }
> override bool opEquals(T)(T value) const if(isNumeric!(T)){
> return this.equals(value);
> }
>
> The compile errors I get look like this:
>
> C:\path\to\file.d(477): Error: function
> units.quantity.opEquals!int.opEquals cannot override a
> non-virtual function
> C:\path\to\file.d(519): Error: template instance
> units.quantity.opEquals!int error instantiating
>
> How can I revise this so that I can override comparison
> operators for things other than class instances?
The first implementation is fine because you're overriding the
implementation in the base class (Object). However, the second
one fails because it's a template. Templates are non-virtual and
cannot override anything. Even if you could, there is no such
implementation in Object and, therefore, nothing to override.
Templated functions can be used as overloads, though, but I'm not
sure off the top of my head if the compiler accepts templated
opEquals on classes at all. My guess is no, but you can find out
by removing the override from the template declaration. If not,
you should be able to implement non-templated overloads for the
types you're interested in (without the override keyword, mind
you, since they won't be overriding anything).
More information about the Digitalmars-d-learn
mailing list