Использование указателя на функцию-член в классе с глобальным typedef - PullRequest
0 голосов
/ 13 октября 2018

Я получаю сообщение об ошибке компилятора в строке func = &Fred::fa;, говоря:

[Error] '((Fred*)this)->Fred::func' cannot be used as a member pointer

, поскольку он имеет тип 'fptr {aka double (*)(int, int)}.Тем не менее, я знаю, что если я определю typedef как класс внутри класса

 typedef double (Fred::*fptr)(int x, int y);

, то это не приведет к ошибке.Но я хочу быть уверен, что typedef определен вне класса.

Что я делаю не так?

#include <iostream>
typedef double (*fptr)(int x, int y);
class Fred
{
private:
  //typedef double (Fred::*fptr)(int x, int y);
  fptr func;
public:
  Fred() 
  {
    func = &Fred::fa;
  }

  void run()
  {
    int foo = 10, bar = 20;
    std::cout << (this->*func)(foo,bar) << '\n';
  }

  double fa(int x, int y)
  {
    return (double)(x + y);
  }        
};

int main ()
{       
  Fred f;
  f.run();
  return 0;
}

1 Ответ

0 голосов
/ 14 октября 2018

Функция и метод разные.Вы не можете вставить указатель на метод в указатель на функцию.Так что

typedef double (*fptr)(int x, int y);

должно быть

typedef double (Fred::*fptr)(int x, int y);

или вы должны использовать оболочку, которая скрывает различия, такие как std::function.

Чего не хватает в

#include <iostream>
typedef double (Fred::*fptr)(int x, int y); // Fred unknown.
class Fred
{
    ...
}

является предварительным объявлением для Fred.Вы не можете использовать Fred, если компилятор не знает Fred существует.

Решение: Форвард объявить Fred.

#include <iostream>
class Fred;
typedef double (Fred::*fptr)(int x, int y); // Fred known enough to get pointers
class Fred
{
    ...
}

Но то, что вы действительно хотите, это std::function.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...