Статическая инициализация constexpr std :: массив объектов, содержащих указатели на функции - PullRequest
1 голос
/ 08 марта 2019

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

#include <array>

using TVoidVoid = void(*)(void);

class State{
public:
  constexpr State(TVoidVoid function) : function_{function}{}
private:
  TVoidVoid function_;
};

void OnEvent1(){}
void OnEvent2(){}
constexpr std::array<State, 10> states = {{OnEvent1}, {OnEvent2}};

int main(){}

Я компилирую с:

g++ -Wall -Wextra -Wshadow -Weffc++ -Wstrict-aliasing -ansi -pedantic -Werror -std=c++14 main.cpp

У меня естьпроблема понимания ошибки компиляции, которую я получаю:

main.cpp:14:69: error: too many initializers for ‘const std::array<State, 10>’
 constexpr std::array<State, 10> states = {{OnEvent1}, {OnEvent2}}

Компилятор g ++ (Ubuntu 7.3.0-27ubuntu1 ~ 18.04) 7.3.0.

В чем здесь может быть проблема?Большое спасибо заранее!

Ответы [ 2 ]

2 голосов
/ 08 марта 2019

Сообщение об ошибке может быть лучше. Но на самом деле инициализация инициализируется тем, что у вас недостаточно скобок. Напомним, что std::array является агрегатным обертыванием необработанного массива. Так что вам нужно инициализировать так:

constexpr std::array<State, 10> states = {{ {OnEvent1}, {OnEvent2} }};

В противном случае, несколько неточный алгоритм обнаружения сокращения скобок предполагает, что {OnEvent1} должен инициализировать внутренний массив, а второе предложение является избыточным.

Теперь вам просто нужно предоставить c'or по умолчанию для State или настроить размер массива.

1 голос
/ 08 марта 2019

Вам нужен конструктор по умолчанию (для последних 8)

#include <array>

using TVoidVoid = void(*)(void);

class State{
public:
  // This static is equivalent to a TVoidVoid
  // used by the default constructor
  static void DefFunct() {}

  constexpr State(TVoidVoid function) : function_{function}{}

  // We create a default constructor for the 
  // empty elemnts of the array with our function
  constexpr State() : function_(DefFunct) {}

private:
  TVoidVoid function_;
};

void OnEvent1(){}
void OnEvent2(){}
constexpr std::array<State, 10> states = {OnEvent1, OnEvent2};

int main(){}
...