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?
Permalink
Reply