2011-12-10 66 views
0
//Forward declaration 
class MyType; 

class Factory{ 
    template<class T> 
    static T* CreateObject(T& newOb){ 
     return &newOb; 
    } 
    //Other non template functions 
} 

//In main (error causing line) 
MyType tmptype; 
MyType* newMyType = Factory::CreateObject<MyType>(tmptype); 

此代码导致此错误: 未定义的参考`的MyType *厂::创建对象(的MyType &)”C++未定义的参考模板成员函数

我也得到这样的警告: 警告:自动导入已经在命令行中未指定--enable-auto-import的情况下被激活

此外,如果我使用int类型,它将无法正常工作,从而排除了未正确包含类型的可能性。

+0

你在上课前缺少一个模板工厂 – marinara

+1

也在类定义上缺少结束分号。 –

+0

请发布重现问题的代码,而不是随机的其他编译错误代码... – sth

回答

1

该函数需要一个引用,所以你需要传递一个编译器可以获取地址的变量。

class Factory{ 
public: 
    template<class T> 
    static T* CreateObject(T& newOb){ 
     return &newOb; 
    } 
    //Other non template functions 
}; 

class MyType {}; 

int main() { 
    MyType a; 
    MyType* newMyType = Factory::CreateObject<MyType>(a); 
} 
+0

对不起,那不是我的实际代码。在我的模拟中,我忘记了公开!该文件中的真实范围是公开的 – RaptorIV

+0

仍然会出现此错误。 – RaptorIV

+0

@RaptorIV你是否得到相同的错误?我从MacOS上用g ++编译的代码复制了两行代码。 – dasblinkenlight

0

您还没有定义MyType。如果您传递的是Factory类中要创建的对象,那么您需要定义要传递的类型。不需要传入工厂类不可能创建的对象类型!所以你MyType应该是定义你自己的数据类型的原型或结构/类的typedef。

理想的情况下,

class MyType{ 
    //Some data structure or type that you want to use. 
}; 

class Factory{ 
public: 
    template<class T> 
    static T* CreateObject(T& newOb){ 
     return &newOb; 
    } 
    //Other non template functions 
} 

将使您的工厂类来创建自己的类型的对象。

+0

MyType的类型定义,只是从例子中排除。 – RaptorIV

+0

您应该至少在您的示例中包含一个前向类声明 - 或者包含或注释以显示该声明。 –

+0

在我的例子中,它似乎工作得很好。唯一可能会丢失的是,您在另一个头文件中声明了MyType,并未将其包含在具有main()函数的文件中。你能提供你尝试过的整个事情吗? – Ajai

0

答案很简单。你的函数调用语法是错误的。您只需要调用Factory::CreateObject(tmptype);

您不需要像模板化类那样实例化模板化函数。

+0

他的代码没有错,至少不是在那个特定的地方。即使编译器可以计算出来,也可以显式指定类型。 – dasblinkenlight