выражение, предшествующее скобке явного вызова, должно иметь тип функции (указатель на -)

#c #pointers #function-pointers

Вопрос:

Я пытаюсь понять, как использовать неупорядоченную карту для вызова методов класса, но когда я это делаю, в ней говорится: «выражение, предшествующее скобке явного вызова, должно иметь тип функции (указатель на)». Почему это происходит и что я могу сделать, чтобы заставить это работать?

 #include lt;iostreamgt; #include lt;unordered_mapgt;  class Calculator { public:  void add(intamp; n) {    n;  }   void sub(intamp; n) {  --n;  } };  int main(int argc, char** args) {  std::unordered_maplt;char, void(Calculator::*)(intamp;)gt; umap;  umap[0] = Calculator::add;  umap[1] = Calculator::sub;  int x;  x = 10;  umap[0](x);  return 0; }  

Комментарии:

1. Есть ли какая-либо причина, по которой вам нужны указатели на функции-члены? Функции не зависят от внутреннего состояния Calculator класса, они могут быть свободными (или static членскими) функциями.

2. Я чувствовал, что было бы проще и чище, если бы они были в классе, разве это не то, что вы можете сделать?

3. Вам нужен объект этого класса для вызова функции. Что-то вроде Calculator c; (c.*(umap[0]))[x] .

4. Функции-члены и функции, не являющиеся членами (например, статические или в области пространства имен), очень разные. Как написано, обе ваши add sub функции и нуждаются в Calculator экземпляре для их вызова, что влияет на синтаксис и то, как вы их на самом деле вызываете. Это действительно то, чего ты хочешь?