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