我曾經有一個正常的成員變量,將其在構造器來初始化如下:平移正常成員變量靜態成員變量導致問題
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;
變量是與作爲密鑰串的圖,並且作爲數據成員函數指針。這工作得很好。然而,正如我所說,我相信這張地圖應該是靜態的(?) - 地圖的原因只是爲了確定程序在閱讀文件時應該做些什麼。 - 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());
如果這些東西都在頭部聲明:
static const std::map<std::string, GMProjectMemFn> ResourceSaveFunctions;
static std::map<std::string, GMProjectMemFn> ResourceSaveFunctions_INIT();
現在編譯突然帶來了很多的錯誤。
1> C:\程序Files \ Microsoft的Visual Studio 10.0 \ VC \包括\實用程序(163):錯誤C2440:初始化:不能從 'INT' 轉換爲 'GMProject :: GMProjectMemFn'
這是關於NULL的轉換。但是,這不僅僅是可能嗎?爲什麼這是不可能的(但在以前的方法中)? 我應該在這裏使用明確的演員嗎?
編輯:定義如下 GMProjectMemFn:
typedef void (GMProject::*GMProjectMemFn)(const pTree&) const;
ptree中是一個容器。
'GMProjectMemFn'的定義是什麼? – Constantinius
你有C++ 11嗎? –
你自己在實現虛擬表嗎?我不清楚你的大地圖o'成員函數指針是否需要......它看起來像是來自C程序的東西。 –