The following questions are from a purely pedagogical view: When a class or function is created using a template and this template is such that it can be used to handle strings, should you add #include <string> at the top of the header file? Also, should you add a 'using std::string'?
You should not include <string> in foo.h just because T can be std::string. If in some other file you use foo<std::string> you include <string> in that file instead.