LINUX.ORG.RU

Помогите разобраться с наследованием в С++


0

0

Есть класс (template) template<class Vtype> class svtVector { protected: Vtype *r; // vectors components int n; // space dimension int T; // T = 0 - vector-columnl; T = 1 - vector-row int *ref_count; // references count public: svtVector(); svtVector(int); svtVector(const svtVector<Vtype> &); virtual ~svtVector();

svtVector<Vtype> &operator=(const svtVector<Vtype> &); svtVector<Vtype> &operator=(const Vtype &); svtVector<Vtype> operator+(const svtVector<Vtype> &); ..... };

я порождаю от него класс

class svtRVector : public svtVector<double> { private: static int rnd; // flag for random-generator initialization public: svtRVector(); svtRVector(int); svtRVector(const svtRVector &R):svtVector<double>(R) {};

void Random(); void PrintSelf() const; };

Для начала хочу добиться работоспособности оператора "="

template <class Vtype> svtVector<Vtype> & svtVector<Vtype>::operator=(const svtVector<Vtype> &R) { if(n != R.n) { n = R.n; if(*ref_count == 1) if(r) delete [] r; r = new Vtype [n]; } for(int i = 0; i < n; ++i) r[i] = R.r[i]; T = R.T; return *this; }

и

template <class Vtype> svtVector<Vtype> & svtVector<Vtype>::operator=(const Vtype &a) { for(int i = 0; i < n; ++i) r[i] = a; return *this; }

но почему-то первый из них наследуется а второй неявным образом вызывает конструктор (который с одним аргументом типа int) Это я зажал используя explicit И второе когда я пытаюсь компилить след код

#include "svtRVector.h"

int main() { svtRVector r1(5); svtRVector r2(5); svtRVector r3;

r1.Random(); r2.Random(); r1.PrintSelf();

r3 = r1+r2; r3.PrintSelf(); return 0; }

Получаю следующее собщение компилятора main.cc: In function `int main()': main.cc:12: no match for `svtRVector& = svtVector<double>' operator svtRVector.h:27: candidates are: svtRVector& svtRVector::operator=(double) svtRVector.h:19: svtRVector& svtRVector::operator=(const svtRVector&)

Помогите разобраться а то я где-то зациклил. Заранее спасибо.

anonymous

ну вроде все правильно,

#define V svtVector //;) #define RV svtRVector //лень писать

копирующий оператор присваивания R& R::operator=(const R& r); генерируется компилятором для любого класса R если не определен в коде.

R::operator=(dopuble) ты не определял, поэтому конструируется из double объект и потом копируется.

и сообщение компилятора это подтверждает.

в общем сформулируй понятнее вопрос, так вроде все правильно :)

anonymous
()

PS. когда будешь формулировать пользуй [User line breaks]

anonymous
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.