Why doesn't `opAssign` work for my templated struct?
Liam McGillivray
yoshi.pit.link.mario at gmail.com
Fri Nov 8 21:55:53 UTC 2024
I am working on a library for making types representing units of
measurement. Base units are derived from a struct called
`BaseUnit`. I want to make it so that `BaseUnit`-derived types
can have their values assigned from float constants, but not from
each-other or from float variables.
I just want to know why the compiler doesn't recognize the
`opAssign` function I have.
```
struct BaseUnit(TThis) {
float value;
this(T)(T v) if(isNumeric!T) {
value = v;
}
void opAssign(T)(const T v) if(isNumeric!T) {
value = v;
}
}
enum Milligrams : BaseUnit!Milligrams;
enum Millimoles : BaseUnit!Millimoles;
unittest {
Milligrams mass = Milligrams(20f);
assert(mass==Milligrams(20f));
mass = 40f;
assert(mass.value==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`
```
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?
More information about the Digitalmars-d-learn
mailing list