我的目标是创建一个系统,其中我可以在运行时提供类的字符串名称,并让它依次返回该类的实例。 在搜索stackoverflow时,我遇到了一个似乎完全正在尝试完成的示例,尽管我目前无法正确编译。以下内容基于该代码:
//LevelObject.h
#pragma once
#include <map>
#include <string>
class LevelObject
{
protected:
int ID;
public:
template<class T> static LevelObject* createT(void)
{
return new T(0);
}
LevelObject(void);
~LevelObject(void);
};
struct BaseFactory
{
typedef std::map<std::string, LevelObject*(*)()> map_type;
static LevelObject* createInstance(const std::string& s)
{
map_type::iterator it = getMap()->find(s);
if(it == getMap()->end())
{
return 0;
}
return it->second();
}
private:
static map_type* objectMap;
protected:
static map_type* getMap()
{
if(!objectMap)
{
objectMap= new map_type;
}
return objectMap;
}
};
template<class T>
struct DerivedRegister : BaseFactory
{
DerivedRegister(const std::string& s)
{
getMap()->insert(std::make_pair( s, &LevelObject::createT<T> ));
}
};
//Item.h
#pragma once
#include "LevelObject.h"
class Item :
public LevelObject
{
int ID;
static DerivedRegister<Item> reg;
public:
Item(int id);
~Item(void);
};
//Item.cpp
#include "Item.h"
Item::Item(int id)
{
ID = id;
}
Item::~Item(void)
{
}
DerivedRegister<Item> Item::reg("item");
逻辑是派生对象,即Item,将注册一个字符串并引用一个返回其自身实例的函数。在调用createInstance时,它将接受用户输入的字符串并使用该映射来确定要返回的对象。
不幸的是,此代码未正确编译,并且给出了以下错误:
错误1错误C2752: '的std :: TR1 :: _ Remove_reference&LT; _Ty&GT;' : 不止一个部分专业化 匹配模板参数列表
错误2错误C2528:'摘要 declarator':指向引用的指针 非法的c:\ program files \ microsoft 视觉工作室 10.0 \ vc \ include \ type_traits 965
错误3错误C2528:'type':指针 引用是非法的c:\ program files \ microsoft visual studio 10.0 \ vc \ include \ type_traits 349
如果有人可以帮助消除这些错误,我将不胜感激。 或许我首先要完全错误,所以如果有人觉得我应该完全走向另一个方向,请告诉我。
提前致谢。
答案 0 :(得分:1)
这个问题发布已经有很长一段时间了,但由于没有答案,我也在这里偶然发现,我想我会加一个。我复制了您所做的相同工厂代码(来自StackOverflow回答here)并遇到了同样的问题。我在this StackOverflow回答时找到了解决方案。
事实证明,Visual Studio 2010(我假设您正在使用)与std::make_pair
存在问题。只需使用std::pair<std::string,LevelObject*(*)()>
代替您就可以了。至少这对我来说解决了这个问题。
答案 1 :(得分:0)
我在LevelObject
类构造函数和析构函数中添加了空体:
LevelObject(void) { }
~LevelObject(void) { }
然后声明map
类的静态BaeFactory
成员变量:
BaseFactory::map_type* BaseFactory::map;
并且在GCC和Visual Studio中编译的代码都没有错误。