Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
'function' : panggilan ambigu ke fungsi kelebihan beban
Komentar
Panggilan fungsi kelebihan beban yang ditentukan tidak dapat diselesaikan. Anda mungkin ingin secara eksplisit melemparkan satu atau beberapa parameter aktual.
Anda juga bisa mendapatkan kesalahan ini melalui penggunaan templat. Jika, di kelas yang sama, Anda memiliki fungsi anggota reguler dan fungsi anggota templat dengan tanda tangan yang sama, yang di-template harus menjadi yang pertama. Batasan ini tetap dalam implementasi Visual C++saat ini.
Contoh
Contoh berikut menghasilkan 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 )
}
Cara lain untuk mengatasi kesalahan ini adalah dengan using deklarasi:
// 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");
}
};
Konversi pada transmisi menggunakan konstanta 0 bersifat ambigu karena int memerlukan konversi baik ke long dan ke void*. Untuk mengatasi kesalahan ini, transmisikan 0 ke jenis parameter fungsi yang tepat yang digunakannya. Maka tidak ada konversi yang perlu dilakukan.
// 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);
}
Kesalahan ini dapat terjadi karena CRT sekarang memiliki float dan double bentuk semua fungsi matematika.
// C2668d.cpp
#include <math.h>
int main() {
int i = 0;
float f;
f = cos(i); // C2668
f = cos((float)i); // OK
}
Kesalahan ini dapat terjadi karena pow(int, int) dihapus dari math.h dalam CRT.
// C2668e.cpp
#include <math.h>
int main() {
pow(9,9); // C2668
pow((double)9,9); // OK
}
Kode ini berhasil di Visual Studio 2015 tetapi gagal di Visual Studio 2017 dan yang lebih baru dengan C2668. Di Visual Studio 2015, pengompilasi secara keliru memperlakukan copy-list-initialization dengan cara yang sama seperti inisialisasi salin reguler. Ini dianggap hanya mengonversi konstruktor untuk resolusi kelebihan beban.
struct A {
explicit A(int) {}
};
struct B {
B(int) {}
};
void f(const A&) {}
void f(const B&) {}
int main()
{
f({ 1 }); // error C2668: 'f': ambiguous call to overloaded function
}