具有函数指针的map列表初始化的类

时间:2018-08-26 00:32:25

标签: c++ class dictionary list-initialization

我正在尝试编写一个类,该类将接收(若干)对char数组(和字符串,稍后介绍)和函数指针,我打算从中使用所需的函数。我将this question中提供的代码的修改版本用于测试目的,所以我有:

#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)
                ^

VERY 长长的注释列表,其中包含候选内容。我在做什么错,我可以像这样初始化地图,还是应该在类中使用初始化函数?

1 个答案:

答案 0 :(得分:3)

就像您提到的链接一样,您需要在初始化器列表中const-键入密钥的类型名称,例如:

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

请注意,密钥是const char* const而不是const char*

Example

如果您不想打扰创建const类型的繁琐任务,则可以改用value_type,例如:

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

Example