Sdílet prostřednictvím


Chyba kompilátoru C2668

'function' : nejednoznačné volání přetížené funkce

Zadané přetížené volání funkce nebylo možné vyřešit. Můžete chtít explicitně přetypovat jeden nebo více skutečných parametrů.

Tuto chybu můžete získat také prostřednictvím použití šablony. Pokud máte ve stejné třídě běžnou členovou funkci a šablonu členské funkce se stejným podpisem, musí být šablona první. Toto omezení zůstává v aktuální implementaci jazyka Visual C++.

Příklady

Následující ukázka vygeneruje 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 )
}

Dalším způsobem, jak tuto chybu vyřešit, je deklaraceusing:

// 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");
   }
};

Převod na přetypování pomocí konstanty 0 je nejednoznačný, protože int vyžaduje převod na long i na void*. Pokud chcete tuto chybu vyřešit, přetypujte číslo 0 na přesný typ parametru funkce, pro který se používá. Pak se nemusí provádět žádné převody.

// 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);
}

K této chybě může dojít, protože CRT má nyní float a double formy všech matematických funkcí.

// C2668d.cpp
#include <math.h>
int main() {
   int i = 0;
   float f;
   f = cos(i);   // C2668
   f = cos((float)i);   // OK
}

K této chybě může dojít, protože pow(int, int) byl odebrán z math.h CRT.

// C2668e.cpp
#include <math.h>
int main() {
   pow(9,9);   // C2668
   pow((double)9,9);   // OK
}

Tento kód je úspěšný v sadě Visual Studio 2015, ale v sadě Visual Studio 2017 a novější s C2668 selže. V sadě Visual Studio 2015 kompilátor chybně zpracovával inicializaci copy-list-list stejným způsobem jako běžná inicializace kopírování. Považuje se pouze za převádění konstruktorů pro rozlišení přetížení.

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
}