2011-12-10 8 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 *工場へ 未定義の参照を:: CreateObjectの(が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 ++でコンパイルしたコードから2行をコピーしました。 – dasblinkenlight

0

MyTypeは定義されていません。ファクトリクラスを渡す場合、作成するオブジェクトを渡す場合は、渡すタイプを定義する必要があります。オブジェクトの型を渡すことなく、ファクトリクラスは作成できません! MyTypeは、独自のデータ型を定義するプリミティブまたはstruct/classの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

関連する問題