Как объявить константный массив указателей на функции?

Во-первых, у меня есть такие функции.

void func1();
void func2();
void func3();

Затем я создаю свой typedef для массива:

void (*FP)();

Если я напишу обычный массив указателей на функции, он должен быть примерно таким:

FP array[3] = {&func1, &func2, &func3};

Я хочу сделать его константным массивом, используя const перед "FP", но у меня есть следующие сообщения об ошибках:

ошибка: невозможно преобразовать инициализацию 'void ( * )()' в 'void ( * const)()'

ПД: Извините за мой плохой английский.

РЕДАКТИРОВАТЬ:

х.ч

typedef void (*FP)();

class x
{
 private:
  int number;
  void func1();
  void func2();
  void func3();
  static const FP array[3];
}

x.cpp

const FP x::array[3] = {&x::func1, &x::func2, &x::func3};

Мой код более большой и сложный, это резюме


person Facon    schedule 04.02.2010    source источник
comment
Всегда лучше написать фактический код, чем говорить «Тогда я создаю свой typedef для массива:» или используя const перед FP.   -  person sand    schedule 04.02.2010
comment
@Facon: Вы используете класс? Не могли бы вы разместить весь код здесь?   -  person Jagannath    schedule 04.02.2010
comment
Да, это правильно. Кстати, какой компилятор вы используете?   -  person Jagannath    schedule 04.02.2010
comment
Не обращай внимания на меня. Как заметил @Prasoon, код неверный. И сообщение об ошибке тоже странное.   -  person Johannes Schaub - litb    schedule 04.02.2010


Ответы (4)


Затем я создаю свой typedef для массива: void (*FP)();

Вы пропустили typedef до void?

Следующие работы над моим компилятором.

 void func1(){}
 void func2(){}
 void func3(){}

 typedef void (*FP)();


 int main()
 {
     const FP ar[3]= {&func1, &func2, &func3};
 }

РЕДАКТИРОВАТЬ

(after seeing your edits)

х.ч

 class x;
 typedef void (x::*FP)(); // you made a mistake here

 class x
 {
   public:
      void func1();
      void func2();
      void func3();
      static const FP array[3];
 };
person Prasoon Saurav    schedule 04.02.2010
comment
Я использовал класс..., у меня возникает та же ошибка, что и при использовании const FP array[3] = ... или при использовании FP const array[3] = ... - person Facon; 04.02.2010
comment
Ух, у тебя хороший глаз, здорово! Учитывая, что в его сообщении об ошибке говорилось void (*)(), я думал о статических функциях-членах, не проверяя, действительно ли они есть. Теперь весь вопрос в том, пропустил ли он запись static, или он опечатался в typedef или/и он опечатался в сообщении об ошибке? хД - person Johannes Schaub - litb; 04.02.2010
comment
@Johannes: Да, его вопрос до редактирования был немного запутанным (потому что в коде не было ошибок). хД :-) - person Prasoon Saurav; 04.02.2010
comment
Теперь у меня есть эта ошибка: x.cpp:line: error: необходимо использовать .* или -›* для вызова функции указателя на член в 'x::array[((int)((x*)this) -›x::number)] (...)' Вызов массива в другом методе класса x. Как вы это называете? - person Facon; 05.02.2010
comment
@PrasoonSaurav Выделение метода доступа к функции из массива завершит сообщение. - person madD7; 02.02.2016

без typedef:

void (*const fp[])() = {
    f1,
    f2,
    f3,
};
person vlk    schedule 15.12.2014

Какой компилятор вы используете? Это работает на VS2005.

#include <iostream>

void func1() {std::cout << "func1" << std::endl;}
void func2() {std::cout << "func2" << std::endl;}
void func3() {std::cout << "func3" << std::endl;}

int main()
{
int ret = 0;

typedef void (*FP)();

const FP array[3] = {&func1, &func2, &func3};

return ret;
}
person sand    schedule 04.02.2010

Если вы хотите, чтобы сам массив был константным:

FP const a[] =
    {
        func1,
        func2,
        func3
    };
person John Dibling    schedule 04.02.2010
comment
Напишет ли он FP const или const FP, не имеет значения. См. этот вопрос: stackoverflow.com /вопросы/1808471/ - person Johannes Schaub - litb; 04.02.2010
comment
@ltib: Хотя я согласен, я не уверен, что вижу актуальность вашего комментария. Возможно, вы просто наблюдаете, в таком случае ура. - person John Dibling; 04.02.2010
comment
Я просто немного смутился, так как ваш ответ и вопрос в основном идентичны. Просто ваш массив не является членом (и что у вас есть константа в другом месте). Поэтому я не вижу актуальности вашего ответа. Но, может быть, вы просто наблюдаете за тем же, так что ура. - person Johannes Schaub - litb; 07.02.2010