2009-04-01 4 views
18

Я пытаюсь получить указатель на определенную версию функции с перегрузкой. Вот пример:Как получить адрес перегруженной функции-члена?

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

Сообщение об ошибке «Ошибка C2440:„инициализации“: не удается преобразовать из„перегруженной-функции“до„MemberFunctionType“»

Это работает, если f не перегружен, но не в приведенном выше примере. Любое предложение?

EDIT

Осторожно, приведенный выше код не отражает мою реальную проблему, которая была, что я забыл «Уст» - это то, что принятый ответ указывает. Я оставлю вопрос таким, какой он есть, хотя, думаю, проблема может случиться с другими.

+0

сделал быструю проверку и все скомпилировано. код выглядит нормально - если это ваш исходный код, конечно: D у вас есть константа точно так же? –

+0

Какую версию MSVC вы используете. Он отлично работает в 2008 году. – Eclipse

+0

конечно. я получаю огромное удовольствие: p –

ответ

27

Ну, я отвечу на то, что я поставил как комментарий уже, чтобы его можно было принять. Проблема с константность:

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

Разъяснение:

оригинальный вопрос не содержит, что const. Я сделал дикую догадку в комментариях, может ли он иметь f, являющийся константной функцией в реальном коде (потому что на еще более ранней итерации оказалось, что еще одна вещь отсутствует/отличается от кода реального мира: p). На самом деле он был членом функции-члена и сказал, что я должен опубликовать это как ответ.

+1

Почему я должен поместить const в объявление указателя !! ?? –

+0

Прошу прощения за путаницу. обновил мой ответ. –

+1

Какой невероятный ответ. Это также была проблема с MY-кодом. Сумасшедший, что вы поставили диагноз на основании предположения. – Raptormeat