2009-04-01 24 views
18

aşırı yüklenmiş üye işlevinin belirli bir sürümüne işaretçi almaya çalışıyorum. İşte örnek:Aşırı yüklenmiş üye işlevinin adresi nasıl alınır?

class C 
{ 
    bool f(int) { ... } 
    bool f(double) { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double); 
    MemberFunctionType pointer = &C::f; // <- Visual C++ complains 
    } 
}; 

hata mesajı "hata C2440: 'başlatılıyor': 'MemberFunctionType' için 'aşırı-fonksiyonu' dan dönüştürmek olamaz"

f aşırı değilse bu işleri

değil Yukarıdaki örnekte. Herhangi bir öneri?

DÜZENLEME Yukarıdaki kod bir "sabit" unutmuştu benim gerçek dünya problemi, yansıtmadığı, Dikkat - bu kabul cevap işaret budur. Soruyu olduğu gibi bırakacağım, çünkü sorunun başkalarına da olabileceğini düşünüyorum.

+0

hızlı bir test yaptı ve her şey derleniyor. kod tamam görünüyor - eğer bu sizin orijinal kodunuzsa: D aynı zamanda tam olarak bu şekilde de var mı? –

+0

Hangi MSVC sürümünü kullanıyorsunuz. 2008'de iyi çalışıyor. – Eclipse

+0

elbette. Harika bir zevk alacağım: p –

cevap

27

Eh, yorum olarak koyduğum şeyi yanıtlayacağım, böylece kabul edilebilir. Sorun constness ile geçerli:

class C 
{ 
    bool f(int) { ... } 
    bool f(double) const { ... } 

    bool example() 
    { 
    // I want to get the "double" version. 
    typedef bool (C::*MemberFunctionType)(double) const; // const required! 
    MemberFunctionType pointer = &C::f; 
    } 
}; 

Açıklama:

orijinal soru const olduğunu içermiyordu. Muhtemelen f'un gerçek kodda bir const üye işlevi olup olmadığına dair yorumlarda vahşi bir tahminde bulunmuştum (çünkü daha önceki bir yinelemede, başka bir şey gerçek dünya kodunda eksik/farklıydı: p). Aslında bir const üyesi işlevi vardı ve bana bunu bir cevap olarak göndermem gerektiğini söyledi.

+1

neden const işaretçi bildirimi koymak zorunda !! –

+0

Karışıklık için üzgünüm. cevabımı güncelledi. –

+1

Ne inanılmaz bir cevap. Bu MY kodu ile de kesin sorun oldu. Bir tahmine dayanarak teşhis ettiğin için deli. – Raptormeat

İlgili konular