2013-12-07 2 views
0

Мне нужно создать конструктор копирования для моего класса MyVector.Конструктор копирования шаблона

#include <iostream> 
using namespace std; 

template<class T> 
class MyVector{ 
    private: 
     T *v; 
     int size; 
     int max; 

    public: 
     MyVector(); 
     MyVector(const MyVector &l); 
     MyVector& operator=(const MyVector &lhs); 
     T &operator[](unsigned int i); 
}; 

int main() { 
    return 0; 
} 

template<class T> 
MyVector& MyVector<T>::operator = (const MyVector &lhs){ 
    if (this == &lhs) return *this; 

    for (int i = 0; i < size; ++i){ 
     delete v[i]; 
    } 

    delete [] v; 

    max = lhs.max; 
    size = lhs.size; 
    v = new T[max]; 

    for(int i = 0; i < size; ++i) { 
     v[i] = new T(*(lhs.v[i])); 
    } 

    return *this; 
} 

им получить ошибку: expected constructor, destructor, or type conversion before âmyVectorâ

Не знаете, где проблема, я довольно новыми для C++. Спасибо.

ответ

1

Следующая проблема:

template<class T> 
MyVector& MyVector<T>::operator = (const MyVector &lhs){ 
    /* ... */ 
} 

Возвращаемый тип, MyVector& должен быть MyVector<T>&, потому что вы находитесь за пределами видимости класса, так что вы должны предоставить шаблонный параметр там, как это:

template<class T> 
MyVector<T>& MyVector<T>::operator = (const MyVector &lhs){ 
    /* ... */ 
} 
+0

Спасибо! Это поразило меня, когда я читал ваш ответ, что это проблема. –

0
MyVector(const MyVector &l); 

должно быть:

MyVector(const MyVector<T> &l); 

и так же везде вы используете MyVector как тип, так как тип не является полным без аргументов шаблона.

+1

-1 Там нет необходимости для этого. –

+0

В области класса шаблона использование имени неявно является полным типом. Поэтому в области 'MyVector ' использование имени 'MyVector' на самом деле является' MyVector '. – mpark

1

В ответ на выполнение функции напишите MyVector<T>.

template<class T> 
MyVector<T>& MyVector<T>::operator = (const MyVector &lhs) 
{ 

Обратите внимание, что вы выполняете оператор присваивания, а не конструктор копирования.

Хорошая альтернатива заключается в использовании C++ 11 синтаксис, где тип возвращаемого следует функцию головы:

template<class T> 
auto MyVector<T>::operator = (const MyVector &lhs) 
    -> MyVector& 
{ 
+0

Спасибо! Я полностью забыл об этом. –

Смежные вопросы