Aracılığıyla paylaş


Derleyici Hatası C2672

'function': eşleşen aşırı yüklenmiş işlev bulunamadı

Derleyici, belirtilen işlevle eşleşen aşırı yüklenmiş bir işlev bulamadı. Eşleşen parametreleri alan bir işlev bulunamadı veya eşleşen hiçbir işlev bağlam içinde gerekli erişilebilirliği içermiyor.

Belirli standart kitaplık kapsayıcıları veya algoritmaları tarafından kullanıldığında, türleriniz kapsayıcının veya algoritmanın gereksinimlerini karşılayan erişilebilir üyeler veya arkadaş işlevleri sağlamalıdır. Örneğin, yineleyici türleriniz türünden std::iterator<>türetilmelidir. Kapsayıcı öğesi türlerinde karşılaştırma işlemleri veya diğer işleçlerin kullanılması için türün hem sol hem de sağ işlenen olarak kabul edilmesi gerekebilir. Türün sağ işlenen olarak kullanılması, işlecin türün üye olmayan bir işlevi olarak uygulanmasını gerektirebilir.

Örnek

Visual Studio 2017'nin önceki derleyici sürümleri, bazı şablon bağlamlarındaki nitelenmiş adlarda erişim denetimi gerçekleştirmedi. Bu, bir adın erişilememesi nedeniyle değiştirmenin başarısız olması beklenen SFINAE davranışına müdahale edebilir. Derleyicinin işlecin yanlış aşırı yüklemesini yanlış çağırması nedeniyle bu durum çalışma zamanında kilitlenmeye veya beklenmeyen davranışa neden olmuş olabilir. Visual Studio 2017'de bir derleyici hatası oluşur.

Bu örnek Visual Studio 2015'te derlenmiş ancak Visual Studio 2017'de hataya neden olur. Bu sorunu düzeltmek için şablon parametresi üyesinin değerlendirildiği yerde erişilebilir olmasını sağlayın.

#include <type_traits>

template <class T> class S {
// public:    // Uncomment this line to fix
    typedef typename T type;
};

template <class T, std::enable_if<std::is_integral<typename S<T>::type>::value, T> * = 0>
bool f(T x)
{
    return (x == 0);
}

int main()
{
    f(10); // C2672: No matching overloaded function found.
}