Четвертая перегрузка должна быть перемещена в верхнюю часть списка, чтобы она отображалась первой.
Все первые три перегрузки пытаются вызвать четвертую перегрузку, но она еще не была объявлена, поэтомуне найден при разрешении перегрузки.
std::wstring
имеет конструктор преобразования, который позволяет неявно преобразовывать const wchar_t*
в std::wstring
.Это частично отвечает за неоднозначность, хотя реальная проблема заключается в упорядочении перегрузок.
Хотя четвертая перегрузка не будет вызвана ни одним из вызовов match
в первых трех перегрузках, существуетэто только двусмысленность для вызова в третьей перегрузке.И вот почему:
inline bool match(const std::wstring & text1, const std::wstring & text2) // (1)
inline bool match(const std::wstring & text1, const wchar_t * text2) // (2)
inline bool match(const wchar_t * text1, const std::wstring & text2) // (3)
inline bool match(const wchar_t * text1, const wchar_t * text2) // (4)
Нет никакой двусмысленности для вызова match
в (1) , потому что в этот момент видна только одна функция с именем match
.
Для вызова match
не существует двусмысленности в (2) , потому что (2) лучше соответствует аргументам, чем (1) :
Для вызова (2) первый аргумент требует вызова конструктора преобразования std::wstring
, а второй аргумент - точное совпадение.
Чтобы вызвать (1) , для обоих аргументов необходимо вызвать конструктор преобразования.
Неоднозначностьпроисходит для (3) , поскольку ни одна из трех доступных перегрузок не является «наилучшей»:
Для вызова (1) , конструктора преобразованиянужно будет вызвать оба аргумента.
Чтобы вызвать (2) , конструктор преобразования должен быть вызван для первого аргумента, а второй аргумент является точным соответствием.
Для вызова (3) первый аргумент является точным совпадением, но для второго аргумента должен быть вызван конвертирующий конструктор.
Ни один из этих трех не является однозначно лучше, чем два других.
Если (4) перемещено для объявления до других перегрузок,это будет однозначно лучшее совпадение для вызова, сделанного в (1) , (2) и (3) , поскольку оба аргумента будут точным соответствиемво всех трех случаях.