Класс с инициализацией списка с помощью указателей на функции

Я пытаюсь написать класс, который получит (число) пару (ы) массивов символов (и строк, позже) и указателей на функции, из которых я планирую использовать нужную функцию. Я использую модифицированную версию кода, представленную в этом вопросе, в целях тестирования, поэтому у меня есть:

#include <iostream>
#include <map>
#include <initializer_list>
using namespace std;

class Test {
    std::map<const char*, void(*)()> m_ints;
public:
    Test(std::initializer_list<std::pair<const char*, void(*)()>> init):
    m_ints(init)
    {}
};

void testfunction(){
    cout << "This is a test function"<<endl;
}

int main()
{
    Test t = { {"hello", &testfunction} };
    return 0;
}

Который при компиляции с g++ возвращает ошибку:

error: no matching function for call to ‘std::map < const char*, void (\*)()>::map(std::initializer_list < std::pair < const char*, void (*)()> >&)’ 

     m_ints(init)
                ^

и ОЧЕНЬ длинный список заметок с кандидатами. Что я делаю не так, могу ли я инициализировать свою карту таким образом, или я должен использовать функцию инициализации в классе?

1 ответ

Решение

Как и ссылка, которую вы упомянули, вам нужно const-Введите имя типа ключа в списке инициализаторов, например:

std::initializer_list<std::pair<const char* const, void(*)()>>

Обратите внимание, ключ const char* const и не const char*,

пример

Если вы не хотите беспокоиться о болезненной задаче создания шрифта const, вы можете использовать value_type вместо этого, например:

std::initializer_list<decltype(m_ints)::value_type>

пример

Другие вопросы по тегам