If you need to return exactly CElements then yes, you will need another clone method that returns CElements.
But you may want not to extend CEnumList but to typedef it like this
typedef CElements = CEnumList<EElements>;
That should do the trick because the result will be correctly typed (as types will be identical, typedef
just gives a synonym).