Long story short -- templatized classes need to be implemented in a header so that the compiler can instantiate the templates.  Once they are in object files (which a `.cpp` file would compile into) the template is static and can not be filled in by the compiler.  You can see how it gets used from `_backend_agg.cpp` and `path_cleanup.cpp` for example.