2016-03-24 7 views
0

クラスVectorを作成すると、なぜクラッシュするのかわかりません。助けてください。このプログラムでは、任意のタイプの要素を配列に追加したいと考えています。私はあなたがテンプレートクラスが定義されているのと同じヘッダに(コンストラクタ定義を含む)メンバ関数定義を配置する必要があり、クロスgccで日食のUbuntu空の角かっこのあるデフォルトのコンストラクタC++のエラー

template<typename T> 
class Vector{ 
    public: 
     Vector(); 
     void add(const T&); 
    private: 
     T *elem; 
     int cap; 
     int len; 
}; 

template<typename T> 
Vector<T>::Vector(){ 
    len = 0; 
    cap = 30; 
    elem = new T[cap]; 
} 

template<typename T> 
void Vector<T>::(const T& m){ 
    elem[len] = m; 
    len ++; 
} 

// Here I create Vector v, if I put Vector<int> v() I don't get error 
Vector<int> v; //error "undefined reference to `Vector<int>::Vector()" 
v.add(21); //error 
+1

[mcve]を入力してください。 – Barry

+0

@Brian「非常に面白い機能」を使わないのはとても面白いです。 :) –

+0

コンパイラは、 'Vector 'を使う予定の時点でテンプレート定義( 'Vector 'クラスとそのメンバ関数の両方)の可視性が必要です。別々のコンパイルとテンプレートはうまくいっていません。クラスを宣言するヘッダにメンバ関数の定義を置き、 'Vector'テンプレートを使用する必要があるコードにヘッダーを'#インクルード 'してください。 [これは完全な答えではありません]。 – Peter

答えて

1

を使用しています。この文

// here i create Vector v, if i put Vector<int> v() i don't get error 
Vector<int> v(); 

については

は、それは戻り値の型Vector<int>を持っており、パラメータを持たない関数の宣言です。タイプVector<int>のオブジェクトの定義ではありません。

関連する問題