2016-09-27 9 views
0

テンプレートクラスがあり、出力演算子をオーバーロードしたい< <、コードが機能しない、わからない...わからないどのように同じことを行うが、入力演算子と...あなたは私を助けることができますか?テンプレートを使用した出力ストリームC++が機能しない

これは私のコードです:

ここ
#include <iostream> 

template<class TypeData, int S> 
class TD{ 
    private: 
     int size; 
     int augmentation; 
     int capacity; 

     TypeData * array; 

     void changeCapacity(); 

    public: 
    TD(); 

    TD(const TD<TypeData,S> & array); 

    TypeData & operator [](int position) const; 

    void addElement(TypeData element); 

    friend std::ostream & operator << (std::ostream & output, const TD<TypeData, S> & array); 

    ~TD(); 
}; 

template<class TypeData, int S> 
TD<TypeData, S>::TD(): 
size(0), augmentation(S), capacity(S){ 
    this->array = new TypeData[S]; 
} 

template<class TypeData, int S> 
TD<TypeData, S>::TD(const TD<TypeData,S> & array): size (array.size), 
augmentation(array.augmentation), capacity(array.capacity){ 
    this->array = new TypeData[array.capacity]; 

    for (int i = 0; i < array.size; i++){ 
     this->array[i] = array[i]; 
    } 
} 

template<class TypeData, int S> 
TypeData& TD<TypeData, S>::operator [](int position) const{ 
    if (position > this->size){ 
      return this->array[0]; 
    } 

    return this->array[position]; 
} 

template<class TypeData, int S> 
void TD<TypeData, S>::addElement(TypeData element){ 
    if (this->capacity <= this->size){ 
     TypeData * ptTmp = new TypeData[this->capacity]; 

     for (int i = 0; i < this->size; i++){ 
      ptTmp[i] = this->array[i]; 
     } 

     delete this->array; 

     this->capacity += this->augmentation; 
     this->array = new TypeData[this->capacity]; 

     for (int i = 0; i < this->size; i++){ 
      this->array[i] = ptTmp[i]; 
     } 

     delete[] ptTmp; 
    } 

    this->array[size] = element; 
    size++; 
} 

template<class TypeData, int S> 
std::ostream & operator << (std::ostream & output, const TD<TypeData, S> & array){ 
    for (int i = 0; i < array.size; i++){ 
     output << array[i] << " - "; 
    } 

    return output; 
} 

template<class TypeData, int S> 
TD<TypeData, S>::~TD(){ 
    delete [] this->array; 
} 

メイン:

int main(){ 

    TD<int,20> t; 
    t.addElement(5); 
    t.addElement(10); 

    std::cout << t << std::endl; 

    return 0; 
} 

私はこのエラーを持っている:

Undefined symbols for architecture x86_64: 
"operator<<(std::__1::basic_ostream<char, std::__1::char_traits<char> >&, TD<int, 20> const&)", referenced from: 
     _main in test9-8bd618.o 
ld: symbol(s) not found for architecture x86_64 
+0

'〜TD()'は宣言されていますが、定義されていません。 –

+0

@RSahu、私は私の駆逐艦をセットするのを忘れて、とにかくそれは動作しません... – winter

+0

それは私に意味をなさないでした。 –

答えて

1

ここにoperator<<関数を宣言する一つの方法ですクラスのfriend

+0

ありがとう!本当にうまくいく!しかし、私はどのように入力ストリームの過負荷を行うことができますか? – winter

+0

@amaia、同じテクニックを使用してください。 –

関連する問題