Why doesn't `opAssign` work for my templated struct?
Nick Treleaven
nick at geany.org
Sat Nov 9 12:33:44 UTC 2024
On Friday, 8 November 2024 at 21:55:53 UTC, Liam McGillivray
wrote:
> enum Milligrams : BaseUnit!Milligrams;
> enum Millimoles : BaseUnit!Millimoles;
These are forward declarations of enumeration types (aka opaque
enums). These types do not inherit from the BaseUnit struct.
Declaring the base type says that the member values of the
enumeration must implicitly convert to the base type.
https://dlang.org/spec/enum.html#named_enums
> Milligrams mass = Milligrams(20f);
I'm not sure why that compiles.
> mass = 40f;
>
> That line in the unit test assigning `40f` to `mass` is giving
> me an error:
> ```
> Error: cannot implicitly convert expression `40.0F` of type
> `float` to `Milligrams`
> ```
Because an enumeration type does not inherit methods of its base
type, there is no opAssign method for enum types.
> However, if I were to change `BaseUnit` into a struct (not a
> struct template), and make `mass` of `BaseUnit` rather than
> `Milligrams`, then the `opAssign` function works as intended.
>
> What's going on?
Then mass of type BaseUnit does have an opAssign member.
More information about the Digitalmars-d-learn
mailing list