2016-04-02 7 views
-2

この質問の起源がテンプレート概念そのものの私の深遠な欠如にあるなら、本当にすみません。なぜ私はテンプレートクラスをC++で使用するために特殊化する必要がありますか?

私は以下のクラスを定義しました。

:単純なテンプレート・テストを行うためには

#include <iostream> 

template <typename T> 
class T3B_data{ 
public: 
    T3B_data<T>(); 
    ~T3B_data<T>(); 
    void fromText(std::istream& is); 
    void fromText(const std::string& textPath); 
    void fromBinary(std::istream& is); 
    std::ostream & toText(std::ostream& oStream)const; 
    std::ostream & toBinary(std::ostream& oStream); 
    friend inline std::ostream& operator << (std::ostream & oStream,const T3B_data<T> & data){ 
     return data.toText(oStream); 
    } 
private: 
    T * mObj; 
}; 

は、私が追加することによって明示的にテンプレートをインスタンス化しなければならなかったなかった理由を得ることが

#include "T3B_data.h" 

int main(void){ 
    T3B_data<int> * myData = new T3B_data<int>(); 
    return 0; 
} 

私はトンをドンインスタンス化するために、メイン次のことを試してみました

template class T3B_data<int>; 

コンパイラがクラスコンストラクタを見つけるためのヘッダーファイルの最後にあります。

注:

私はラインを追加すると、実際には、まったく新しいクラスの生成を強制することを十分に認識してメートル。私はちょうどメインのコードが実際にコンパイルレベルでテンプレートインスタンスを強制していない理由を得ることはできません。

注2:

STLコンテナを使用しているとき、私は自己定義型などでそれを使用するたびに、それをインスタンス化する必要はありませんので、私は、イムは、何か間違ったことをするかなり確信している:

struct myStruct{ 
    int a; 
    std::string; 
}; 
std::vector<myStruct> a; 

この質問に興味を持っている人には、事前に感謝します。

EDIT:私は主に私のヘッダファイルを移動し、宣言の終わりに、{}を使用して実装をスタブとして

何かが、私の実装では全く間違っている必要があります。テンプレートクラスT3B_dataなしですべてが正常にコンパイルされます。宣言。 separating constructor implementation with template from header file

+0

あなたの混乱の理由は明らかではありません。あなたのtempateクラスは、STLのテンプレートと全く同じ方法で使用できます。例えば、 – user3159253

+0

。変数 'T3B_data t3b;'を 'std :: vector r ;; – user3159253

+0

のように作成することができます。逆の場合もあります:STLテンプレートであれ、ユーザ定義であれ、明示的なテンプレートパラメータの特殊化が必要です。新しい割り当ては – user3159253

答えて

0

に複製されて終わる

質問あなたはtemplateクラスの実装ファイルとヘッダーファイルを使用している場合、コンパイラはそのためのメモリ確保の理由でクラスで使用される任意の種類を知る必要があります型をプログラム内のクラスのテンプレート引数として使用する場合は、明示的にtemplate class T3B_data<int>を宣言する必要があります。

これを回避するには、別々の実装ファイルを使用する代わりに、テンプレートクラスのすべてのメソッドを定義して実装することができます(必要に応じて、テンプレートクラスのサイズのコード)。

関連する問題