Compilador erro C2668
Mensagem de erro
'função': telefonar ambígua para função sobrecarregada
A telefonar de função sobrecarregada especificado não pôde ser resolvida.É aconselhável converter explicitamente um ou mais dos parâmetros real.
Você também pode obter esse erro por meio do uso do modelo.Se, na mesma classe, você tem uma função de membro regular e uma função de membro de modelo com a mesma assinatura, um modelo deve ser primeiro.Esta é uma limitação da implementação corrente do Visual C++.
Consulte o artigo do base de dados de conhecimento Q240869 para obter mais informações em ordem parcial dos modelos de função.
Se você estiver criando um projeto ATL que contenha um objeto COM suporte ISupportErrorInfo, consulte o artigo da base de dados de conhecimento da Q243298.
Exemplo
O exemplo a seguir gera 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 )
}
Outra maneira de resolver esse erro é com um Usando declaração:
// 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");
}
};
Este erro também pode ser gerado sistema autônomo resultado do trabalho de conformidade de compilador que foi concluído para o Visual Studio .NET 2003: conversão ambíguo na conversão constante 0.
Conversão de uma conversão usando 0 constante é ambíguo, pois int requer uma conversão tanto longo e para void *.Para resolver esse erro, converter 0 para o tipo exato do parâmetro de função que está sendo usado para que nenhuma conversão precise ocorrer (esse código serão válido na versões de Visual Studio .NET 2003 e Visual Studio .NET do Visual C++).
Consulte o resumo de time de compilar separável alterações para obter mais informações.
// 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);
}
Este erro pode ocorrer porque a CRT agora tem float e double formas de todas as funções de matemática.
// C2668d.cpp
#include <math.h>
int main() {
int i = 0;
float f;
f = cos(i); // C2668
f = cos((float)i); // OK
}
Este erro pode ocorrer porque o pow(int, int) foi removido do math.h no CRT.
// C2668e.cpp
#include <math.h>
int main() {
pow(9,9); // C2668
pow((double)9,9); // OK
}