The following template seems to be giving link errors. 
- Is there a reason and a workaround for this code? 
 - I initially started using templates because the overload for bool was getting auto-promoted and conflicting with overload for bool. Is there any way to work around that
 - In the readMember function call code, it seems I have to specify the template type, even though system has enough knowledge to infer the type. Am I doing something wrong?
Background - I am trying to auto-generate code based on an internal version of class schemas
 
#include <string>
#include <vector>
#include <json/json.h> // uses jsoncpp
template <typename T>
  bool readMember(const Json::Value& details, const std::string& member, T& value);
template<> bool readMember<std::string>(const Json::Value& details, const std::string& member, std::string& value) {
  return true;
}
template<> bool readMember<int>(const Json::Value& details, const std::string& member, int& value) {
  return true;
}
template<> bool readMember<bool>(const Json::Value& details, const std::string& member, bool& value) {
  return true;
}
template<typename T> bool readMember(const Json::Value& details, const std::string& member,
                           std::vector<T>& value) {
     Json::Value root = details[member];
     for (Json::Value::iterator it=root.begin(); it!=root.end(); ++it) {
         T item_value;
         bool status = readMember<T>(*it, member, item_value);
         value.push_back(item_value);
    }
    return false;
}
class _Settings {
public:
  std::string BE_SERVER;
  std::vector<std::string> backendEnvs;
};
template<> bool readMember<_Settings>(const Json::Value& details, const std::string& member, _Settings& value) {
    readMember<std::vector<std::string>>( details[member], "BE_SERVER", value.BE_SERVER);
    readMember<std::vector<std::string>>( details[member], "backendEnvs", value.backendEnvs);
};
The error is
Undefined symbols for architecture x86_64:
  "bool readMember<std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > > >(Json::Value const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, std::__1::vector<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >, std::__1::allocator<std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > > >&)", referenced from:
      bool readMember<_Settings>(Json::Value const&, std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, _Settings&) in settings.o
Notes :- Template line std::string compiles, while the vector line fails.