Ошибка компилятора C2668
Обновлен: Ноябрь 2007
Сообщение об ошибке
"функция" : неоднозначный вызов перегруженной функции
'function' : ambiguous call to overloaded function
Указанный вызов перегруженной функции не удалось разрешить. Следует явным образом привести один или несколько фактических параметров.
Эта ошибка может возникать при использовании шаблонов. Если в одном и том же классе содержится как обычная функция-член, так и шаблонная функция-член с такой же сигнатурой, то шаблонная функция должна следовать первой. Это ограничение текущей реализации Visual C++.
Дополнительные сведения о частичном упорядочивании шаблонов функций см. в статье базы знаний Q240869.
При сборке проекта ATL, который содержит объект модели COM, поддерживающий интерфейс ISupportErrorInfo, см. статью базы знаний Q243298.
Пример
Следующий пример приводит к возникновению ошибки C2668:
// C2668.cpp
struct A {};
struct B : A {};
struct X {};
struct D : B, X {};
void func( X, X ){}
void func( A, B ){}
D d;
int main() {
func( d, d ); // C2668 D has an A, B, and X
func( (X)d, (X)d ); // OK, uses func( X, X )
}
Другим методом устранения этой ошибки является using-объявление:
// C2668b.cpp
// compile with: /EHsc /c
// C2668 expected
#include <iostream>
class TypeA {
public:
TypeA(int value) {}
};
class TypeB {
TypeB(int intValue);
TypeB(double dbValue);
};
class TestCase {
public:
void AssertEqual(long expected, long actual, std::string
conditionExpression = "");
};
class AppTestCase : public TestCase {
public:
// Uncomment the following line to resolve.
// using TestCase::AssertEqual;
void AssertEqual(const TypeA expected, const TypeA actual,
std::string conditionExpression = "");
void AssertEqual(const TypeB expected, const TypeB actual,
std::string conditionExpression = "");
};
class MyTestCase : public AppTestCase {
void TestSomething() {
int actual = 0;
AssertEqual(0, actual, "Value");
}
};
Данная ошибка также может возникать в результате работы по стандартизации компилятора, проведенной в Visual Studio .NET 2003: неоднозначное преобразование в приведении константы 0.
Преобразование в приведении с использованием константы 0 является неоднозначным, так как тип int требует преобразования как в long, так и в void*. Чтобы устранить эту ошибку, приведите 0 к точному типу параметра функции, для которого он используется, чтобы преобразования были не нужны (этот код будет допустим в версиях Visual C++ сред Visual Studio .NET 2003 и Visual Studio .NET).
Дополнительные сведения см. в разделе Сводная информация о критических изменениях времени компиляции.
// C2668c.cpp
#include "stdio.h"
void f(long) {
printf_s("in f(long)\n");
}
void f(void*) {
printf_s("in f(void*)\n");
}
int main() {
f((int)0); // C2668
// OK
f((long)0);
f((void*)0);
}
Эта ошибка может возникать из-за того, что в библиотеке CRT теперь присутствуют версии всех математических функций как для типа float, так и для типа double.
// C2668d.cpp
#include <math.h>
int main() {
int i = 0;
float f;
f = cos(i); // C2668
f = cos((float)i); // OK
}
Эта ошибка может возникнуть, поскольку функция pow(int, int) была удалена из файла math.h в библиотеке CRT.
// C2668e.cpp
#include <math.h>
int main() {
pow(9,9); // C2668
pow((double)9,9); // OK
}