Aracılığıyla paylaş


Derleyici Hatası C2668

'function' : Aşırı yüklenmiş işleve belirsiz çağrı

Belirtilen aşırı yüklenmiş işlev çağrısı çözümlenemedi. Gerçek parametrelerin birini veya daha fazlasını açıkça atamanız gerekebilir.

Bu hatayı şablon kullanımı aracılığıyla da alabilirsiniz. Aynı sınıfta normal bir üye işleviniz ve aynı imzaya sahip bir şablonlu üye işleviniz varsa, önce şablonlanmış olanın gelmesi gerekir. Bu sınırlama, Visual C++'ın geçerli uygulamasında kalır.

Örnekler

Aşağıdaki örnek C2668 oluşturur:

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

Bu hatayı çözmenin bir diğer yolu da bir using bildirimdir:

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

0 sabiti kullanılarak bir atamada dönüştürme işlemi belirsizdir çünkü int hem öğesine long hem de öğesine dönüştürme gerektirir void*. Bu hatayı çözmek için 0 değerini, kullanılmakta olduğu işlev parametresinin tam türüne dönüştürebilirsiniz. Daha sonra hiçbir dönüştürmenin gerçekleşmesi gerekmez.

// 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'de artık tüm matematik işlevlerinin ve double biçimlerinin olması float nedeniyle bu hata oluşabilir.

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

CRT'de öğesi kaldırıldığından math.h bu hata oluşabilirpow(int, int).

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

Bu kod Visual Studio 2015'te başarılı olur, ancak C2668 ile Visual Studio 2017 ve sonraki sürümlerde başarısız olur. Visual Studio 2015'te derleyici hatalı bir şekilde copy-list-initialization işlemini normal kopya başlatma ile aynı şekilde ele alır. Yalnızca aşırı yükleme çözümlemesi için oluşturucuları dönüştürmeyi dikkate alır.

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
}