std::массив указателей на функции

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

Вот версия, которая не выдает ошибок, пока я ее не скомпилирую.

namespace logic {
    class Chance : public Field {
        std::array<void(logic::Chance::*)(), 18> m_redChances;
    public:
        Chance(ChanceType type);
        void redChance1();
        void redChance2();
        ...
        void redChance18();
    };
}

logic::Chance::Chance(ChanceType type) 
    : Field(false), m_type(type) 
{
    m_redChances[0] = redChance1;
    m_redChances[1] = redChance2;
    ....
    m_redChances[17] = redChance18;
}

Это дает мне

нестандартный синтаксис; используйте '&' для создания указателя на элемент

Пытался сделать что-то подобное тогда

m_redChances[0] = &redChance1;

Завершено с

'&': недопустимая операция над выражением связанной функции-члена

Пытался объявить мой массив вот так

std::array<void(*)(), 18> m_redChances;

значение типа "void(logic::Chance::)()" не может быть присвоено объекту типа "void()()"

Редактировать: Итак, после реализации вот так: m_redChances[0] = &Chance::redChance1; это работает. Как я могу на самом деле вызвать эту функцию (если это имеет значение, я вызываю ее из другой функции-члена).

Я пробовал все виды вещей, таких как:

void logic::Chance::activate(logic::Player& player){
    m_redChances[0];
    *m_redChances[0];       
    m_redChances[0]();
    (*m_redChances[0])();
}

Только первая строка не подчеркнута и не помечена как ошибка еще до того, как я скомпилирую, но она не вызывает мою функцию. Как я могу достичь этого тогда?


person JohnDoe    schedule 19.01.2018    source источник
comment
попробуй с m_redChances[0] = &Chance::redChance1;   -  person 眠りネロク    schedule 20.01.2018
comment
В отличие от функций, не являющихся членами, функции-члены не преобразуются автоматически в указатели на функции-члены. Следовательно, вам нужно использовать &Chance::redChance1, &Chance::redChance2 и т. д.   -  person R Sahu    schedule 20.01.2018
comment
Вы не пытаетесь хранить (бесплатные) указатели функций в своем массиве. Вы пытаетесь сохранить указатели на функции member, а это совсем другое.   -  person Jesper Juhl    schedule 20.01.2018
comment
Если вы будете искать это сообщение об ошибке в SO, вы получите много сообщений. stackoverflow.com/.   -  person R Sahu    schedule 20.01.2018
comment
Сначала указатель на функцию выглядит следующим образом: void (*foo)(int), где foo — имя указателя на функцию, а int — тип параметра. Во-вторых, вы также можете попробовать std::function‹void(int)› = std::bind(&Object:Function, Arg...). Пожалуйста, перейдите по ссылке en.cppreference.com/w/cpp/utility/functional /связать   -  person Yirui Jiang    schedule 20.01.2018