I have made some improvements to the LAPACK binding to the HSEQR function, taking into account the suggestions by Karl and Thomas.  The use of templated structs to differentiate between complex and double arguments was very helpful.  

Karl suggested using workspaces to allow the use of BLAS3 calls.  HSEQR has the ability to calculate the optimal workspace size when called with specific parameters.  For this reason, I decided not to use the workspaces, but just asked HSEQR to tell indicate what the size should be.  Similar functionality is in GEEV and I tried to follow the example there.  Please correct me if my assumption is incorrect.

Finally, I'm still having some troubles and I was hoping someone could help me understand where the problem is.  I am trying to pass a pointer to a complex matrix.  I tried using traits::complex_ptr(Z) (where Z is the complex matrix), but that only passes a double* instead of traits::complex_d*.  

It's probably best to show this specifically with my code.  I have attached my hseqr.hpp file.  The calls to hseqr_backend from the Hseqr<2> struct compile just fine, but the calls from the Hseqr<1> struct don't compile and give  the error messages in the file mk.tmp.  Can someone help me understand how to fix this?

Thanks again,
Jeremy