C++:泛型 >> 如何为充当静态实例创建者的泛型函数定义多个模板定义



Hiho,

我正在研究一些关于实例的东西,想知道是否可以为类/结构及其后续派生类创建一个通用的实例创建函数。我有两个问题和一个可能性问题:

  1. 为了使其工作,泛型函数至少可以交付类/结构本身的一个实例,函数是活的/存在的。-->得到未定义的引用错误
  2. 为了使其工作,泛型函数可以交付几种类型的实例-->得到未定义的引用类型错误
  3. 是否可以通过在这些派生中实现进一步的模板声明,使泛型函数交付未来派生类型的类型。因此,具有泛型函数的基类不需要了解它们(根据我对情况的理解,永远不可能,因为我不知道未来的子类/派生类会遵循什么(

为了更好地理解,我准备了一个例子:

//base.hpp
struct base {
base(int param1, int param2) : a(param1), b(param2)
{}
private:
int a,b;
public:

template <typename T> static T createInstanceGeneric(int param1, int param2){
return T(param1, param2); 
}
//Thats of course working//
static base createInstance(int param1, int param2) { 
return base(param1, param2);
}
void update(int param2){
_update(0, param2);
}
void process() { int tmp = a; a = b; b = tmp }
protected:
void _update(int param1, int param2){
a = param1;
b = param2;
}    
}
//END base.hpp
//childOne.hpp
#include "base.hpp"
struct childOne : public base {
childOne(int param1, int param2) : base(param1, param2 ){}
//Thats of course working//
static base createInstanceOfBase(int param1, int param2) { 
return  base::createInstance(param1, param2);
}
static childOne createInstanceOfSelfViaGeneric(int param1, int param2) { 
return base::createInstanceGeneric<childOne>(param1, param2);
}
static base createInstanceOfBaseViaGeneric(int param1, int param2) { 
return  base::createInstanceGeneric<base>(param1, param2);
}
void update(int param1){
base::_update(param1, 0);
}                   
}
//END childOne.hpp
//app.cpp
#include "childOne.hpp"

void calledLaterForSomeStuff( const base& data  ){
data.process();
}
void main()
{
base test1 = base::createInstance(0,1); //Working
test1.update(2);
calledLaterForSomeStuff(test1);
base test2 = childOne::createInstanceOfBase(0,1); //Working
test2.update(2);
calledLaterForSomeStuff(test2); 
//undefined reference to `base base::createInstanceGeneric<base>(int param1, int param2)'//
//undefined reference to `base base::createInstanceGeneric(int param1, int param2)'//
base test3 = childOne::createInstanceOfBaseViaGeneric(0,1); //Question 1 and 2
test3.update(2);
calledLaterForSomeStuff(test3);
//undefined reference to `childOne base::createInstanceGeneric<childOne>(int param1, int param2)'
//undefined reference to `childOne base::createInstanceGeneric(int param1, int param2)'
childOne test4 = childOne::createInstanceOfSelfViaGeneric(0,1); //Question 3
test4.update(3);
calledLaterForSomeStuff(test4); 
}
//END app.cpp

好的,它开箱即用。我在cpp文件中实现了模板。但它只允许在hpp中使用。

现在它起作用了。

案例关闭

最新更新