Если вы посмотрите на Pointer.h
, вы увидите различные шаблонные определения GetValueByPointer()
.
template <typename T>
typename T::ValueType* GetValueByPointer(T& root, const GenericPointer<typename T::ValueType>& pointer, size_t* unresolvedTokenIndex = 0) {
return pointer.Get(root, unresolvedTokenIndex);
}
template <typename T>
const typename T::ValueType* GetValueByPointer(const T& root, const GenericPointer<typename T::ValueType>& pointer, size_t* unresolvedTokenIndex = 0) {
return pointer.Get(root, unresolvedTokenIndex);
}
template <typename T, typename CharType, size_t N>
typename T::ValueType* GetValueByPointer(T& root, const CharType (&source)[N], size_t* unresolvedTokenIndex = 0) {
return GenericPointer<typename T::ValueType>(source, N - 1).Get(root, unresolvedTokenIndex);
}
template <typename T, typename CharType, size_t N>
const typename T::ValueType* GetValueByPointer(const T& root, const CharType(&source)[N], size_t* unresolvedTokenIndex = 0) {
return GenericPointer<typename T::ValueType>(source, N - 1).Get(root, unresolvedTokenIndex);
}
Теперь вы надеетесь на неявное преобразование типов из std::string -> GenericPointer<...>
, которое не произойдет из-за правила C ++, что допускается не более 1 неявного преобразования типов. Здесь вам понадобится std::string -> const CharType(&source)[N] -> GenericPointer<...>
, что является одним неявным преобразованием слишком много.
Я думаю, что самым простым способом исправить ваше затруднительное положение было бы то, что вы написали свою собственную версию этой функции (как вы, вероятно, будете вызывать ее пару раз), конечно же, с шаблонами, как и другие, и которая требует const std::string &
или const std::basic_string<CharType>&
и выполните преобразование явно.
Это, плюс удаление строки, о которой я упоминал в своем комментарии, должно работать.