Почему конструктор копирования требуется инициализировать из буквального списка (в скобках) внутри инициализации карты? - PullRequest
0 голосов
/ 05 ноября 2019

Я пытаюсь инициализировать 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 ++?) Если так, что я делаю не так?

ОБНОВЛЕНИЕ:

Итак, что не так, это удаление конструктора копирования. В связи с этим, почему конструктор копирования требуется для статической инициализации, но только внутри карты? Я не понимаю.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...