2011-12-10 83 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