FE_Poly and FE_PolyTensor get a classname for the polynomial space as a template argument. This leads to some awkward duplication of code, see for example the explicit specializations in fe_poly.cc. I think that in practice, this could be avoided by not passing the name of the polynomial space class to FE_Poly and FE_PolyTensor but instead passing an object and then storing a pointer to it in the class. This should also significantly reduce compile time because the same class doesn't have to be instantiated that many times (and we could move the contents of the .templates.h file into the .cc file because we then know what template arguments to instantiate).
Related to #1198.