Почему компилятор не выполняет преобразование типов? - PullRequest
10 голосов
/ 22 июля 2011

Рассмотрим следующий код.

#include <iostream>
#include <string>

struct SimpleStruct
{
    operator std::string () { return value; }
    std::string value;
};

int main ()
{
    std::string s;    // An empty string.
    SimpleStruct x;   // x.value constructed as an empty string.

    bool less = s < x; // Error here.
    return 0;
}

Этот код не компилируется ни на g ++, ни на Microsoft Visual C ++. Отчет об ошибке, предоставленный компиляторами, no match for operator '<' in 's < x'. Вопрос в том, почему компилятор не просто конвертирует SimpleStruct x в string в соответствии с заданным значением operator string (), а затем использует operator < ( string, string )?

1 Ответ

13 голосов
/ 22 июля 2011

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
}
...