Я пытаюсь инициализировать std::map
, который будет ссылаться на указатели на функцию со строкой, чтобы использовать ее как фабрику. Однако я не могу правильно его инициализировать и не могу найти, что не так с моим кодом. Указатель на функцию определяется внутри класса Operation
.
Operation.hpp
class Operation {
public:
size_t const nb_args;
operation_t & operation;
static operation_t pop;
Operation ( Operation const & ) = delete;
// Test the syntax
static Operation const Pop;
static std::map<std::string const, std::pair<int, int>> const test;
static std::map<std::string const, Operation const> const ops;
};
Operation.cpp
// Compiles fine
Operation const Pop = {1, Operation::pop};
// Compile fines
std::map<
std::string const,
std::pair<int, int>> const Operation::test = {
{"pop", {5, 5}}
};
// Compile error
std::map<
std::string const,
Operation const> const Operation::ops = {
{"pop", {1, Operation::pop}}
};
operation_t
- это typedef длясигнатура функции.
Что я не понимаю, так это то, что мои первые два элемента компилируются нормально (Pop
и test
), но третий сбой.
Я ожидаю, что проблемабыть либо с инициализацией для определенного пользователем типа с литерала, либо с вложенностью на карте, но, видимо, только комбинация обоих причин вызывает проблемы!
Полученное сообщение об ошибке:
Operation.cpp:56:2: error: could not convert ‘{{"pop", {1, Operation::pop}}}’
from ‘<brace-enclosed initializer list>’
to ‘const std::map<const std::__cxx11::basic_string<char>, const Operation>’
56 | };
| ^
| |
| <brace-enclosed initializer list>
make: *** [Makefile:22: Operation.o] Error 1
(я компилирую с -std=c++17
и моя версия gcc 9.2.0
)
Возможно ли то, что я пытаюсь достичь? (И хорошо ли это в c ++?) Если так, что я делаю не так?
ОБНОВЛЕНИЕ:
Итак, что не так, это удаление конструктора копирования. В связи с этим, почему конструктор копирования требуется для статической инициализации, но только внутри карты? Я не понимаю.