C++ 模板工厂提供链接器错误并忽略引用类型
我正在为我的项目创建一个模板工厂,在我需要在对象创建过程中添加一个额外的参数之前,一切都很正常 工厂有两个主要模板:C++ 模板工厂提供链接器错误并忽略引用类型,c++,templates,linker,C++,Templates,Linker,我正在为我的项目创建一个模板工厂,在我需要在对象创建过程中添加一个额外的参数之前,一切都很正常 工厂有两个主要模板: template <typename T> class GenericFactory_c: boost::noncopyable { public: typedef typename T::ObjectType_t ObjectType_t; //basic creating with just 1 parameter
template <typename T>
class GenericFactory_c: boost::noncopyable
{
public:
typedef typename T::ObjectType_t ObjectType_t;
//basic creating with just 1 parameter (object name)
ObjectType_t Create(const String_c &className, const String_c &name) const
{
typename ObjectCreatorSet_t::const_iterator it = setObjectCreators.find(className, ObjectCreatorComp_s<T>());
if(it == setObjectCreators.end())
PH_RAISE(OBJECT_NOT_FOUND_EXCEPTION, "[EntityFactory_c::Create]", name);
return it->Create(name);
}
//"advanced" creation using an additional Y parameter
template <typename Y>
ObjectType_t Create(const String_c &className, const String_c &name, Y param) const
{
typename ObjectCreatorSet_t::const_iterator it = setObjectCreators.find(className, ObjectCreatorComp_s<T>());
if(it == setObjectCreators.end())
PH_RAISE(OBJECT_NOT_FOUND_EXCEPTION, "[EntityFactory_c::Create]", name);
return it->Create(name, param);
}
//rest of the code, probably irrelavent to the problem removed for clarity
};
最后是我的问题,对于上面的代码,编译器似乎忽略了对*this
的引用,并尝试创建实体对象的副本,我得到了对实体c::实体c(const Entity_c&)
的未定义引用,这是可以的,因为实体c
没有副本构造函数(不可复制),但问题是,这段代码不会试图复制实体_c
,而是使用它引用
有什么想法吗?如果这个函数
Entity_c::CreateCompXYZ()
{
EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance();
EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this);
}
实际上是为3个参数调用此模板Create
//"advanced" creation using an additional Y parameter
template <typename Y>
ObjectType_t Create(const String_c &className, const String_c &name, Y param) const
//使用附加Y参数进行“高级”创建
模板
ObjectType\u t Create(常量字符串\u c&className、常量字符串\u c&name、Y参数)常量
它实际上是试图复制实体c(这里是Y
)
当然,如果它是不可复制的,这就不起作用了 如果此函数
Entity_c::CreateCompXYZ()
{
EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance();
EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this);
}
实际上是为3个参数调用此模板Create
//"advanced" creation using an additional Y parameter
template <typename Y>
ObjectType_t Create(const String_c &className, const String_c &name, Y param) const
//使用附加Y参数进行“高级”创建
模板
ObjectType\u t Create(常量字符串\u c&className、常量字符串\u c&name、Y参数)常量
它实际上是试图复制实体c(这里是Y
)
当然,如果它是不可复制的,这就不起作用了 谢谢。事实上,我重新分析了这段代码,使它变得简单了一点,并修复了这个问题,这确实是由您发现的问题引起的。谢谢。事实上,我重新分析了这段代码,使它变得更简单,并修复了问题,这实际上是由您发现的问题引起的。
Entity_c::CreateCompXYZ()
{
EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance();
EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this);
}
Entity_c::CreateCompXYZ()
{
EntityComponentFactory_c &factory = EntityComponentFactory_c::GetInstance();
EntityComponentPtr_t xyz = factory.Create("XYZ", "myXYZInstance", *this);
}
//"advanced" creation using an additional Y parameter
template <typename Y>
ObjectType_t Create(const String_c &className, const String_c &name, Y param) const