нестатическая функция-член 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 ‘()’ ?)

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


person lnvm    schedule 18.10.2016    source источник


Ответы (1)


Вам нужно привести возвращаемое значение 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.

person R Sahu    schedule 18.10.2016
comment
Я хочу, чтобы c1 был функцией, кроме того, reinterpret_cast не может преобразовать int в double - person lnvm; 18.10.2016
comment
@R Саху, замечательно! Это работает, но не могли бы вы объяснить, почему? - person lnvm; 18.10.2016
comment
@ Gr.Five, надеюсь, добавленное объяснение имеет смысл. - person R Sahu; 18.10.2016