2016-04-10 6 views
-1

私はこのページを読んでいますWhy can templates only be implemented in the header file? しかし、それはテンプレートクラスに関するものです。コンストラクタはクラスと同じ型をとります(クラスが< int>の場合、コンストラクタもintをとるなど)。しかし、私は単純な(テンプレートではない)クラスを持っています。重複して申し訳ありません、私はこの場合何をすべきか説明してください。テンプレートコンストラクタの実現を分離する方法(クラスがテンプレートでない場合)

フィールド 'double d'を持つクラス 'Object'があり、テンプレートコンストラクタを作成したいと思います。私がクラス内でそれを認識すると、すべてうまくいくが、クラス外(.hから.cppへ)の実現を動かすと動作しない。ここに私のコードです:

Object.hが

class Object { 
    double d; 
public: 
    template <class T> Object(T t); 
}; 

Object.cpp

#include "Object.h" 

template <class T> Object::Object(T t) { 
    d = t; 
} 

Xを作成

#include "Object.h" 

int main() { 
    int a = 5; 
    Object x(a); 
    float b = 2.5; 
    Object y(b); 
    return 0; 
} 

エラーがラインにmain.cppにに表示されますmain.cppにし、 y、あります:

undefined reference to `Object::Object<int>(int)' 
undefined reference to `Object::Object<float>(float)' 
+1

[なぜテンプレートはヘッダーファイルにのみ実装できますか?](http://stackoverflow.com/questions/495021/why-can-templates-only-be-implemented-in-the-header -file) – ForceBru

答えて

1

Object.cppを取り除き、その内容をヘッダーファイルに移動します。

コンパイラがObject.cppを扱う場合、いくつかのテンプレートしかないのでバイトコードは生成されません。あなたのコードにObject::Object<int>(int)の '言及'が出たら、それはヘッダーファイルに行き、テンプレートパラメータを推測し、すべてを正常にコンパイルします。

しかし、リンカーは満足できません。 Object::Object<int>(int)への呼び出しを見ますが、このメソッドのバイトコードを見つけることができず、エラーが発生します。

template <class T> Object::Object(T t)mainに定義することはできますが、あまりうまくいかず、混乱する可能性があります。

+0

は 追加について明確な説明 – Pavel

+0

いただき、ありがとうございます「テンプレートクラスオブジェクトを、 テンプレートクラスオブジェクト;」を main.cppにの先頭に - 私は(ない「非テンプレートクラスを持っているので、それは動作しません。テンプレートオブジェクト "、しかし単純な"クラスオブジェクト ")。 – Pavel

+0

@Pavel、うん、これに気付いてくれてありがとう。編集された今 – ForceBru

0

すべてのテンプレートをヘッダーファイルで使用する必要があります。 .cppファイルでのみそれらを実装する場合、その.cppファイルだけがそれを見ることができます。

関連する問題