2016-10-18 13 views
0

код:нестатическая функция член reinterpret_cast не удалось

#include <iostream> 

using namespace std; 

struct item 
{ 
    int f1() {} 
    double f2() {} 

    static int g1() {} 
    static double g2() {} 

    void f0(); 
}; 
void item::f0() 
{ 
    auto c1 = reinterpret_cast<decltype(f2)>(f1); 
    auto c2 = reinterpret_cast<decltype(g2)>(g1); 

    auto c3 = reinterpret_cast<decltype(&f2)>(f1); 
    auto c4 = reinterpret_cast<decltype(&g2)>(g1); 
} 
int main() 
{ 
    cout << "Hello world!" << endl; 
    return 0; 
} 

сообщение об ошибке:

main.cpp|17|error: invalid use of non-static member function| 
main.cpp|18|error: invalid cast from type ‘int (*)()’ to type ‘double()’| 
main.cpp|20|error: ISO C++ forbids taking the address of an unqualified or parenthesized non-static member function to form a pointer to member function. Say ‘&item::f2’ [-fpermissive]| 
main.cpp|20|error: invalid use of member function (did you forget the ‘()’ ?) 

мой вопрос: Функции-члены, передаваемые в качестве аргументов будет автоматически преобразовать в указатель, так что я стараюсь отливку аргумент указателю, но все еще не удалось. Я не понимаю, почему нестатическая функция-член не работает во всех ситуациях .

ответ

0

Вам необходимо указать возвращаемое значение f1, а не f1. Использование:

auto c1 = reinterpret_cast<decltype(f2())>(f1()); 
               ^^ Call the function 

Аналогичные изменения переходят на другие линии.

Я неправильно понял, что вы пытались сделать. Следующий должны работать:

auto c1 = reinterpret_cast<decltype(&item::f2)>(&item::f1); 
    auto c2 = reinterpret_cast<decltype(&g2)>(g1); 

    auto c3 = reinterpret_cast<decltype(&item::f2)>(&item::f1); 
    auto c4 = reinterpret_cast<decltype(&g1)>(g2); 

f1 является не- функцией static члена. Вы можете назвать это, используя f1(). Однако без синтаксиса вызова функции нестатические функции-члены не автоматически разлагаются на указатель функции-члена. Чтобы получить указатель на функцию-член struct, вам необходимо использовать &item::f1.

+0

Я хочу, чтобы c1 был функцией, кроме того, reinterpret_cast не может преобразовать int в double – lnvm

+0

@ Gr.Five, см. Обновленный ответ. –

+0

@R Sahu, замечательный! Это работает, но не могли бы вы объяснить, почему? – lnvm

 Смежные вопросы

  • Нет связанных вопросов^_^