我试图建立一个将传入类型的工厂,而不是对其进行硬编码。但是,当我尝试将类型添加到类型.cpp文件中的工厂时,会出现链接器错误。例如,他是我当前遇到的链接器错误。
1> RandomClass.obj:错误LNK2019:未解决的外部符号“public:short __thiscall TemplatedFactory::AddType(char const *)”(?? $ AddType @ VRandomClass @@@ TemplatedFactory @@ QAEFPBD @ Z)在函数“void _cdecl中引用” “用于'private:static short RandomClass::ID''(void)的动态初始值设定项(?? _ E?ID @ RandomClass @@ 0FA @@ YAXXZ)
我试图使测试用例尽可能小,尽管它确实跨五个文件,但它们却很小
BaseClass.h:http://codepad.org/MhZMw7t0
#pragma once
class BaseClass{ };
RandomClass.h:http://codepad.org/xoObzP8G
#pragma once
#include "BaseClass.h"
class RandomClass : public BaseClass
{
private:
static short ID;
public:
RandomClass();
virtual ~RandomClass();
};
TemplatedFactory.h:http://codepad.org/qkcTBw24
#pragma once
#include <map>
using std::map;
#include "BaseClass.h"
template<typename Type> BaseClass* createType() { return new Type; }
class TemplatedFactory
{
private:
typedef BaseClass* (*ComponentFactoryFuncPtr)();
typedef map<const char*, ComponentFactoryFuncPtr> map_type;
map_type m_Map;
public:
static TemplatedFactory &GetInstance();
template<typename Type>
short AddType(const char* componentName);
};
RandomClass.cpp:http://codepad.org/ALoF3Ysb
#include "RandomClass.h"
#include "TemplatedFactory.h"
short RandomClass::ID = TemplatedFactory::GetInstance().AddType<RandomClass>("RandomClass");
RandomClass::RandomClass() { }
RandomClass::~RandomClass() { }
TemplatedFactory.cpp:http://codepad.org/iqgNqa6H
#include "TemplatedFactory.h"
TemplatedFactory &TemplatedFactory::GetInstance()
{
static TemplatedFactory instance;
return instance;
}
template<typename Type>
short TemplatedFactory::AddType(const char* componentName)
{
ComponentFactoryFuncPtr function = &createType<Type>;
m_Map.insert(std::make_pair(componentName, function));
return 0;
}
如果我移动,则可以删除链接器错误
short RandomClass::ID = TemplatedFactory::GetInstance().AddType<RandomClass>("RandomClass");
从RandomClass.cpp到TemplatedFactory.cpp,但是,我想在RandomClass.cpp中声明。有谁知道解决此问题的方法或更好的设计(无需使用外部库)。
最佳答案
没有export
,模板化函数的定义和声明就不能彼此分开,而TemplateFactory::AddType
可能是编译器不支持的。您需要将ojit_code定义移至标题。
关于c++ - C++中的模板工厂模式,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/5185502/