2016-09-27 51 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

// Forward declare the class. 
template<class TypeData, int S> class TD; 

// Declare the function. 
template<class TypeData, int S> 
std::ostream & operator << (std::ostream & output, const TD<TypeData, S> & array); 

// Define the class. 
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); 

    // Declare the friend. 
    // This makes sure that operator<< <int, 5> is a friend of TD<int, 5> 
    // but not a friend of TD<double, 20> 
    friend std::ostream & operator << <TypeData, S> (std::ostream & output, const TD<TypeData, S> & array); 

    ~TD(); 
}; 
+0

谢谢!真的有作用!但我怎么能做一个输入流超载? – winter

+0

@amaia,使用相同的技术。 –