Карта STL - нет соответствующего конструктора - PullRequest
0 голосов
/ 20 февраля 2019

У меня есть стандартная карта, которая объединяет строку с указателем функции, например:

 std::map<std::string, void (*)()> funcs {
       {"print", &h::print},
       {"scan", &h::scan_cmd},
       {"connect", &h::stream},
       {"stream", &h::stream}
 };

, где h - это класс включения, в котором эта карта была инициализирована:

class h {
public:
   void print();
   void scan();
   void connect();
   void stream();
   std::map<std::string, void (*)()> funcs {
           {"print", &h::print},
           {"scan", &h::scan_cmd},
           {"connect", &h::stream},
           {"stream", &h::stream}
     };
};

Я получаю эту ошибку:

No matching constructor for initialization of 'std::map<std::string, void (*)()>' (aka 'map<basic_string<char>, void (*)()>')

Я также пытался поместить карту в эту форму:

std::map<std::string, void (*)()> funcs;
funcs["print"] = &print;
funcs["scan"] = &scan_cmd;
funcs["connect"] = &stream;
funcs["stream"] = &stream;

Но потом я получил эту ошибку:

Size of array has non-integer type ' const char [6]'

Я не совсем уверен, где проблема - я предполагаю, что это с частью void (*) ().Я уверен, что это компилятор c ++ 11.

1 Ответ

0 голосов
/ 21 февраля 2019
void (*)()

- указатель на обычную функцию, которая не принимает аргументов и не возвращает значения.В вашем примере print, stream, scan_cmd являются нестатическими функциями-членами класса h.Синтаксис для определения указателя на функции-члены класса h выглядит следующим образом:

void (h::*)()

Попробуйте:

   std::map<std::string, void (h::*)()> funcs {
           {"print", &h::print},
           {"connect", &h::stream},
           {"stream", &h::stream}
     };
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...