Depending on what you mean by exclude the types string or char. If you want it not to link you can declare but not define specializations for the types:
template <> void parse<std::string>( std::string & value, const std::string& token );
The compiler will see the specialization and not generate the code. The linker will fail as the symbol is not defined in any translation unit.
The second approach, a bit more complicated is not to fail at link time, but to make the compiler not accept the template for those types. This can be done with SFINAE, which is simpler in C++11, but if you need a C++03 solution you can google for it or add a comment:
template <typename T, typename = typename std::enable_if<!std::is_same<T,std::string> && !std::is_same<T,char>>::type > void parse( T & t, const std::string& token ) { // ... }
(I have not run this through a compiler so the syntax might be a bit off, play with it) The compiler will see the template, and when it tries to perform the substitution of the type T it will fail due to the std::enable_if<...>::type not resolving to a type.
In general, what you probably want is to provide different overloads that perform a specific version of the parse and take precedence:
void parse( std::string& v, const std::string& token ) { v = token; }
Note that this is not a template, but a regular function. A non-templated function will be a better match than a templated one when the arguments of the call are perfect matches.