Ошибка компилятора C2666
Обновлен: Ноябрь 2007
Сообщение об ошибке
"идентификатор": для "число" перегрузок есть подобные преобразования
'identifier' : number overloads have similar conversions
Определены неоднозначные перегруженные функции или операторы. Степень соответствия списков формальных параметров не позволяет компилятору разрешить неоднозначность. Чтобы устранить эту ошибку, явно укажите один или несколько фактических параметров.
В следующем примере возникает ошибка C2666:
// C2666.cpp
struct complex {
complex(double);
};
void h(int,complex);
void h(double, double);
int main() {
h(3,4); // C2666
}
Это ошибка также может возникать в результате выполнения действий по обеспечению совместимости компилятора с Visual Studio .NET 2003:
бинарные операторы и пользовательские преобразования в типы указателей;
преобразования квалификации не аналогичны преобразованиям идентификации.
В текущей версии параметры, передаваемые в бинарные операторы <, >, <= и >=, неявно преобразуются к типу операнда, если в типе параметра определен соответствующий пользовательский оператор преобразования. В этом случае возникает потенциальная неоднозначность.
Дополнительные сведения см. в разделе Сводная информация о критических изменениях времени компиляции.
В коде, совместимом с версиями Visual C++ для Visual Studio .NET 2003 и Visual Studio .NET, следует явно вызвать оператор класса с использованием синтаксиса функции.
Пример
// C2666b.cpp
#include <string.h>
#include <stdio.h>
struct T
{
T( const T& copy )
{
m_str = copy.m_str;
}
T( const char* str )
{
int iSize = (strlen( str )+ 1);
m_str = new char[ iSize ];
if (m_str)
strcpy_s( m_str, iSize, str );
}
bool operator<( const T& RHS )
{
return m_str < RHS.m_str;
}
operator char*() const
{
return m_str;
}
char* m_str;
};
int main()
{
T str1( "ABCD" );
const char* str2 = "DEFG";
// Error – Ambiguous call to operator<()
// Trying to convert str1 to char* and then call
// operator<( const char*, const char* )?
// OR
// trying to convert str2 to T and then call
// T::operator<( const T& )?
if( str1 < str2 ) // C2666
if ( str1.operator < ( str2 ) ) // Treat str2 as type T
printf_s("str1.operator < ( str2 )\n");
if ( str1.operator char*() < str2 ) // Treat str1 as type char*
printf_s("str1.operator char*() < str2\n");
}
В следующем примере возникает ошибка C2666
// C2666c.cpp
// compile with: /c
enum E
{
E_A, E_B
};
class A
{
int h(const E e) const {return 0; }
int h(const int i) { return 1; }
// Uncomment the following line to resolve.
// int h(const E e) { return 0; }
void Test()
{
h(E_A); // C2666
h((const int) E_A);
h((int) E_A);
}
};