Megjegyzés
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhat bejelentkezni vagy módosítani a címtárat.
Az oldalhoz való hozzáféréshez engedély szükséges. Megpróbálhatja módosítani a címtárat.
"függvény" : nem egyértelmű hívás túlterhelt függvényhez
Megjegyzések
A megadott túlterhelt függvényhívás nem oldható fel. Előfordulhat, hogy egy vagy több tényleges paramétert explicit módon át kell alakítania.
Ezt a hibát sablon használatával is megkaphatja. Ha ugyanabban az osztályban egy normál tagfüggvény és egy azonos aláírású sablonos tagfüggvény van, akkor először a sablonos függvénynek kell lennie. Ez a korlátozás a Visual C++ jelenlegi implementációjában marad.
Példák
Az alábbi példa c2668-at hoz létre:
// 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 )
}
A hiba megoldásának másik módja egy using deklaráció:
// 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");
}
};
A 0 konstans alkalmazásával történő típuskonverzió félreérthető, mivel a int átalakítást igényel mind a long-re, mind a void*-re. A hiba megoldásához adja meg a 0-t a használt függvényparaméter pontos típusára. Ezután nincs szükség átalakításra.
// 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);
}
Ez a hiba azért fordulhat elő, mert a CRT most már rendelkezik a matematikai függvények float és double formájával.
// C2668d.cpp
#include <math.h>
int main() {
int i = 0;
float f;
f = cos(i); // C2668
f = cos((float)i); // OK
}
Ez a hiba azért fordulhat elő, mert az pow(int, int) el lett távolítva a CRT-ből math.h .
// C2668e.cpp
#include <math.h>
int main() {
pow(9,9); // C2668
pow((double)9,9); // OK
}
Ez a kód a Visual Studio 2015-ben sikeres, de a Visual Studio 2017-ben és később a C2668-ban meghiúsul. A Visual Studio 2015-ben a fordító hibásan kezelte a copy-list-inicializálást ugyanúgy, mint a normál másolás-inicializálást. Csak a konstruktorok konvertálását vette figyelembe a túlterhelés feloldásához.
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
}