我有这堂课:
class LevelParser
{
private:
int tileSize;
std::vector<Tileset>* pTilesets;
typedef LayerABC* (*pFunc)();
std::unordered_map<std::string, pFunc> layerFactory;
template <typename T>
void registerLayer(std::string layerName);
LayerABC* createLayer(std::string layerName);
};
template <typename T>
void LevelParser::registerLayer(std::string layerName)
{
auto Iterator = layerFactory.find(layerName);
if(Iterator != layerFactory.cend())
{
return;
}
layerFactory[layerName] = [&] () -> LayerABC* {return new T(tileSize, pTilesets); };
}
它编译好了,但是当通过工厂创建一个图层时,程序制动并且IDE指向我使用'registerLayer'函数的lambda行。
LevelParser类变量'tileSize'和'pTilesets'稍后在解析过程中和层创建发生之前初始化,这就是为什么它们是通过引用捕获的,这就是lambda应该工作的原因,但事实并非如此。
有谁知道出了什么问题?
P.S。
有一种解决方案可以避免将参数传递给层构造函数,如下所示:
layerFactory[layerName] = [] () -> LayerABC* {return new T(); };
并在构造之后通过'init(int,std :: vector&lt; Tileset&gt; *)'函数初始化对象,该函数实际上将复制构造函数完成的初始化作业 - 但这是第二个手段。