C++ 无法将初始值设定项列表转换为映射

C++ cannot convert initializer list to map

提问人:float 提问时间:6/20/2023 最后编辑:float 更新时间:6/20/2023 访问量:91

问:

我在头文件中声明了一个映射,该文件将 2 个字符串映射到另一个 cpp 文件中的函数指针。但是,我收到以下错误:

Error   C2440   'initializing': cannot convert from 'initializer list' to 'std::map<std::string,std::map<std::string,std::function<void (Comp::Abc::Ptr,int)>

我的头文件如下:


#include "../Comp/include/ABC.h"
#include <map>
#include <string>
#include <functional>

namespace Comp {

    std::map<std::string, std::map<std::string, std::function<void(Comp::Abc::Ptr, int)>>> myMap = {
    {"Abc1", {
        {"QType", [](Comp::Abc1::Ptr abc, int arg) { 
                     abc->setQType(static_cast<EnumTYPEDEF_Q_TYPE>(arg)); }},
    {"Counter", [](Comp::Abc1::Ptr abc, int arg) { abc->setCounter(arg); }},
    {"GroupId", [](Comp::Abc1::Ptr abc, int arg) { abc->setGroupId(arg); }},
        }},
        {"Abc2", {
        {"Type",  [](Comp::Abc2::Ptr abc, int arg) { abc->setType(arg); }},
        }},
}
       
};
  

其他文件包括: ABC.h

namespace Comp{

class Abc{
  virtual void setCounter(int c){}
  virtual void setType(int c){}
  virtual void setGroupId(int c){}
  virtual void setQType(EnumTYPEDEF_Q_TYPE c){}
}

class Abc1:public Abc{
  virtual void setCounter(int c);
  virtual void setGroupId(int c);
  virtual void setQType(EnumTYPEDEF_Q_TYPE c);
}

class Abc2:public Abc{
  virtual void setType(int c);
}
};

和 abc.cpp

namespace Comp{
void Abc1 :: setCounter(int c){
  //some code
}
void Abc1 :: setGroupId(int c){
  //some code
}
void Abc1 :: setQType(EnumTYPEDEF_Q_TYPE c){
  //some code
}
void Abc2 :: setType(int c){
  //some code
}
}

地图已正确声明,我无法理解错误。

其中一些函数将枚举作为输入参数,但这是由静态强制转换处理的。

我还尝试使用模板作为函数指针:

template<typename ArgType>
using MemberFunctionPtr = void (Comp::Abc1::*)(ArgType);
std::map<std::string, std::map<std::string, MemberFunctionPtr<int>>> myMap;

但这也没有奏效。

C++ 初始值设定项列表 嵌套映射

评论

1赞 Jan Schultke 6/20/2023
无法重现,在消除第一个参数时编译良好 godbolt.org/z/61dxv5jWh 请提供一个最小的可重现示例
0赞 nick 6/20/2023
您使用的是什么 CPP 标准?嵌套初始值设定项列表从 Cpp17 开始工作,我相信(或 14?

答: 暂无答案