operator<
для std::string
- это шаблон функции.Перегрузки:
template<class charT, class traits, class Allocator>
bool operator< (const basic_string<charT,traits,Allocator>& lhs,
const basic_string<charT,traits,Allocator>& rhs);
template<class charT, class traits, class Allocator>
bool operator< (const basic_string<charT,traits,Allocator>& lhs,
const charT* rhs);
template<class charT, class traits, class Allocator>
bool operator< (const charT* lhs,
const basic_string<charT,traits,Allocator>& rhs);
Ваш звонок не соответствует ни одной из доступных перегрузок, поэтому они все удалены из списка кандидатов.Поскольку ни один шаблон функции не был выбран в качестве кандидата для разрешения вызова, преобразовать SimpleStruct нечему.
template <class T>
class String
{
};
template <class T>
bool operator< (const String<T>&, const String<T>&) { return true; }
//if a suitable non-template function is available, it can be picked
//bool operator< (const String<char>&, const String<char>&) { return true; }
struct SimpleStruct
{
operator String<char> () { return value; }
String<char> value;
};
int main()
{
String<char> s;
SimpleStruct ss;
s < ss; //the call doesn't match the function template, leaving only the commented-out candidate
}