Обходной путь 1
Задайте проблемный параметр в качестве первого типа шаблона и передайте его явно.
template<typename Parameter,
typename Return,
typename Container>
Container
StringTo (Parameter&& copy,
const char tokens[],
Return (Container::*Insert) (const Parameter&))
{
Container container;
// do something ...
return container;
}
template<typename Type>
auto
StringToVector (Type&& copy,
const char tokens[])
{
return StringTo<Type>(std::move(copy), tokens, &std::vector<Type>::push_back);
} // ^^^^^^ here (explicit) ^^^^ passed anyways
Демо
Обходной путь 2
Если мы скомпрометируем часть Type
и будем напрямую использовать std::string
, то эта ошибка также исчезнет в MSVC.
template<typename Return,
typename Container>
Container
StringTo (std::string&& copy, // Type --> std::string
const char tokens[],
Return (Container::*Insert) (const std::string&))
{
Container container;
// do something ...
return container;
}
inline
auto
StringToVector (std::string&& copy,
const char tokens[])
{
return StringTo(std::move(copy), tokens, &std::vector<std::string>::push_back);
}
Demo .