C++ 将普通成员变量转换为静态成员变量会导致问题

C++ 将普通成员变量转换为静态成员变量会导致问题,c++,static-members,C++,Static Members,我以前有一个普通成员变量,它在构造函数中初始化如下: ResourceSaveFunctions[OBJECTS_IDENT] = NULL; ResourceSaveFunctions[SPRITES_IDENT] = &GMProject::SaveSprite; ResourceSaveFunctions[SOUNDS_IDENT] = &GMProject::SaveSound; ResourceSaveFunctions[BACKGROUNDS_IDENT] = &am

我以前有一个普通成员变量,它在构造函数中初始化如下:

ResourceSaveFunctions[OBJECTS_IDENT] = NULL;
ResourceSaveFunctions[SPRITES_IDENT] = &GMProject::SaveSprite;
ResourceSaveFunctions[SOUNDS_IDENT] = &GMProject::SaveSound;
ResourceSaveFunctions[BACKGROUNDS_IDENT] = &GMProject::SaveBackground;
ResourceSaveFunctions[PATHS_IDENT] = NULL;
ResourceSaveFunctions[SCRIPTS_IDENT] = NULL;
ResourceSaveFunctions[FONTS_IDENT] = NULL;
ResourceSaveFunctions[TIMELINES_IDENT] = NULL;
ResourceSaveFunctions[ROOMS_IDENT] = NULL;
ResourceSaveFunctions["extension"] = &GMProject::SaveExtension;
ResourceSaveFunctions[INCLUDES_IDENT] = NULL;
ResourceSaveFunctions[TRIGGERS_IDENT] = NULL;
std::map<std::string, GMProject::GMProjectMemFn> GMProject::ResourceSaveFunctions_INIT() {
    std::map<std::string, GMProjectMemFn> tmp;
    tmp.insert(std::make_pair(OBJECTS_IDENT,NULL));
    tmp.insert(std::make_pair(SPRITES_IDENT, &GMProject::SaveSprite));
    tmp.insert(std::make_pair(SOUNDS_IDENT, &GMProject::SaveSound));
    tmp.insert(std::make_pair(BACKGROUNDS_IDENT, &GMProject::SaveBackground));
    tmp.insert(std::make_pair(PATHS_IDENT, NULL));
    tmp.insert(std::make_pair(SCRIPTS_IDENT, NULL));
    tmp.insert(std::make_pair(FONTS_IDENT, NULL));
    tmp.insert(std::make_pair(TIMELINES_IDENT, NULL));
    tmp.insert(std::make_pair(ROOMS_IDENT, NULL));
    tmp.insert(std::make_pair("extension", &GMProject::SaveExtension));
    tmp.insert(std::make_pair(INCLUDES_IDENT, NULL));
    tmp.insert(std::make_pair(TRIGGERS_IDENT, NULL));
    return tmp;
}
const std::map<std::string, GMProject::GMProjectMemFn> GMProject::ResourceSaveFunctions(GMProject::ResourceSaveFunctions_INIT());
typedef void (GMProject::*GMProjectMemFn)(const pTree&) const; 
该变量是一个映射,具有作为键字符串和作为数据成员函数指针的属性。这工作做得非常好。然而,正如我所说的,我相信这个映射应该是静态的(?)-映射的原因只是为了确定程序在读取文件时应该做什么。-空表示“不做任何特别的事情”

因此,我将其更改为以下内容:

ResourceSaveFunctions[OBJECTS_IDENT] = NULL;
ResourceSaveFunctions[SPRITES_IDENT] = &GMProject::SaveSprite;
ResourceSaveFunctions[SOUNDS_IDENT] = &GMProject::SaveSound;
ResourceSaveFunctions[BACKGROUNDS_IDENT] = &GMProject::SaveBackground;
ResourceSaveFunctions[PATHS_IDENT] = NULL;
ResourceSaveFunctions[SCRIPTS_IDENT] = NULL;
ResourceSaveFunctions[FONTS_IDENT] = NULL;
ResourceSaveFunctions[TIMELINES_IDENT] = NULL;
ResourceSaveFunctions[ROOMS_IDENT] = NULL;
ResourceSaveFunctions["extension"] = &GMProject::SaveExtension;
ResourceSaveFunctions[INCLUDES_IDENT] = NULL;
ResourceSaveFunctions[TRIGGERS_IDENT] = NULL;
std::map<std::string, GMProject::GMProjectMemFn> GMProject::ResourceSaveFunctions_INIT() {
    std::map<std::string, GMProjectMemFn> tmp;
    tmp.insert(std::make_pair(OBJECTS_IDENT,NULL));
    tmp.insert(std::make_pair(SPRITES_IDENT, &GMProject::SaveSprite));
    tmp.insert(std::make_pair(SOUNDS_IDENT, &GMProject::SaveSound));
    tmp.insert(std::make_pair(BACKGROUNDS_IDENT, &GMProject::SaveBackground));
    tmp.insert(std::make_pair(PATHS_IDENT, NULL));
    tmp.insert(std::make_pair(SCRIPTS_IDENT, NULL));
    tmp.insert(std::make_pair(FONTS_IDENT, NULL));
    tmp.insert(std::make_pair(TIMELINES_IDENT, NULL));
    tmp.insert(std::make_pair(ROOMS_IDENT, NULL));
    tmp.insert(std::make_pair("extension", &GMProject::SaveExtension));
    tmp.insert(std::make_pair(INCLUDES_IDENT, NULL));
    tmp.insert(std::make_pair(TRIGGERS_IDENT, NULL));
    return tmp;
}
const std::map<std::string, GMProject::GMProjectMemFn> GMProject::ResourceSaveFunctions(GMProject::ResourceSaveFunctions_INIT());
typedef void (GMProject::*GMProjectMemFn)(const pTree&) const; 

p树是一个容器。

std::make_pair
创建一个
,其中类型
T1
T2
是从参数的类型隐式推导出来的
NULL
扩展为
0
(或
0L
),因此在您的情况下
make\u pair
返回
对(或

然后,您尝试将该
传递到
map::insert()
,但这需要一个

std::pair
有一个通用复制构造函数,它将尝试对pair的每个成员进行隐式转换:

template <class U, class V>
    pair (const pair<U,V> &p) : first(p.first), second(p.second) { }

啊。NULL可能仅定义为文字0,
make\u pair
将其推断为整数,
pair
不能转换为
pair
。它通过操作符[]处理赋值,因为(我猜)隐式转换从0到
GMProjectMemFn


因此,请尝试编写
make_pair(PATHS_IDENT,(GMProjectMemFn)0)

GMProjectMemFn的定义是什么?您是否自己实现了虚拟表?我不清楚你的大图o'成员函数指针需要什么…它看起来像是C程序中的某些东西。@Kerrek_SB“部分”-使用visual studio 2010-但不,我不能使用初始值设定项列表。@JohnZwinck这是用于类似“xml文件”的东西-在正常保存期间,可以使用标准方法-包括读取包含文件位置的xml值,然后复制该文件。但是,由于我无法控制xml文件的格式,在某些特定情况下,会发生一些额外的情况。对于这些情况,我编写了一个单独的函数。但是,
std::pair
不是有一个非显式的
广义复制构造函数,它接受一个任意类型的
std::pair
并进行成员转换吗?因此,只要
int
可以转换为
GMProjectMemFn
,那么
应该可以转换为
。是的,你完全正确。真正的问题是
int常量&
不能隐式转换为指针。我会更正我的答案。谢谢你指出这一点!