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.