2009-04-01 9 views
18

Estoy tratando de obtener un puntero a una versión específica de una función de miembro sobrecargada. Aquí está el ejemplo:¿Cómo obtener la dirección de una función miembro sobrecargada?

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

El mensaje de error es "error C2440: 'inicialización': no ​​se puede convertir de 'función sobrecargada' a 'MemberFunctionType'"

Esto funciona si f no está sobrecargado, pero no en el ejemplo anterior. ¿Cualquier sugerencia?

EDITAR

cuidado, el código anterior no reflejaba mi problema del mundo real, que era que había olvidado un "const" - esto es lo que señala la respuesta aceptada. Aunque dejaré la pregunta tal como está, porque creo que el problema podría pasarle a otros.

+0

hizo una prueba rápida y todo compila. el código se ve bien - si este es su código original, por supuesto: D ¿tiene usted también la const-ness exactamente como eso? –

+0

¿Qué versión de MSVC estás usando? Funciona bien en 2008. – Eclipse

+0

por supuesto. Voy a disfrutar mucho: p –

Respuesta

27

Bueno, ya responderé lo que puse como comentario para que pueda ser aceptado. El problema es que con constness:

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

Aclaración:

La pregunta original no contenía que const. Hice una conjetura descabellada en los comentarios si él posiblemente tiene f siendo una función miembro en el código real (porque en una iteración anterior, resultó que faltaba otra cosa/era diferente al código del mundo real: p). Él realmente tenía una función de miembro de la estafa, y me dijo que debería publicar esto como una respuesta.

+1

¿por qué tengo que poner const en la declaración del puntero? –

+0

siento la confusión. actualicé mi respuesta. –

+1

¡Qué increíble respuesta! Este fue el problema exacto con mi código también. Loco que lo diagnosticaste en base a una suposición. – Raptormeat

Cuestiones relacionadas