IIRC a templated function is a better match than converting to a base class, but a more distant base class is not.

I don't think this issue has caused very many problems so far.  The only one I can remember is `ErrorExp` inheriting some methods from `IntegerExp` that it shouldn't have.  Even if we find a way to make this work, adding a new class will not be anywhere near foolproof.  The usual procedure (for me) is to base the new class off an existing one, and grep the source for all uses.

I prefer explicitly calling a common method over having common implementations in base class methods anyway, because this pattern makes the dependence clearer.