Addition operators for length units
The obvious possibility would be to just define the functions inside the class definition:

template &lt;typename StorageType&gt;
class Metres : public Unit&lt;StorageType&gt; {
public:
    static Metres fromMetres(StorageType metres) noexcept { return metres; }

    Metres operator+ (Metres rhs) const noexcept { 
        return getRawValue() + rhs.getRawValue(); 
    }

    Metres operator+ (Centimetres&lt;StorageType&gt; rhs) const noexcept { 
        getRawValue() + rhs.getRawValue() / StorageType(100); 
    }

    Metres operator+ (Millimetres&lt;StorageType&gt; rhs) const noexcept { 
        getRawValue() + rhs.getRawValue() / StorageType(1000); 
    }

protected:
    using Unit&lt;StorageType&gt;::Unit;
};


The problem (as I'd see it, anyway) stemmed from two facts: these are templates, so you needed to include the template parameters, and the bodies of the functions in question are so tiny, they basically got lost in the noise.

Both of these point to the fact that (in this case) including the function definitions inline in the class definition gains a great deal, and loses nothing.