Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 10.05.2012, 22:27   #1
monnzz
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию проблемы с operator = в шаблонах

значит есть следующий код, не понимаю, что неправильно делаю в перегрузке оператора =

Код:
#include "stdafx.h"
#include <iostream>
using namespace std;
const int DefaultSize = 10;

class Animal
{
public:
	Animal (int);
	Animal ();
	~Animal () {}
	int GetWeight () const { return itsWeight; }
	void Display () const { cout << itsWeight << endl; }
private:
	int itsWeight;
};

Animal::Animal (int weight):
itsWeight (weight)
{}

Animal::Animal ():
itsWeight (0)
{}

template <class T>
class Array
{
public:
	Array (int itsSize = DefaultSize);
	Array (const Array & rhs);
	~Array () { delete [] pType; }

	Array & operator = (const Array &);
	T & operator [] (int offset) { return pType [offset]; }
	const T &  operator [] ( int offset) const {return pType [offset]; }
	
	int GetSize () const { return itsSize; }

private:
	T * pType;
	int itsSize;
};

template < class T >
Array <T> ::Array (int size):
itsSize( size)
{
	pType = new T [size];
}

template <class T>
Array <T> ::Array (const Array & rhs)
{
	itsSize = rhs.GetSize ();
	pType = new T [itsSize];
	for (int i = 0; i < itsSize; i++)
		pType [i] = rhs [i];
}

template <class T>
Array <T> & Array <T>::operator= ( const Array & rhs)
{                                                                               !!!!!!!!!!!!!
	if (this = &rhs)                                                  !!!!!!!!!!!!!
		return *this;
	delete [] pType;
	itsSize = rhs.GetSize ();
	pType = new T [itsSize];
	for (int i = 0; i < itsSize; i++)
		pType[i] = rhs [i];
	return *this;
}


int main ()
{
	Array <int> theArray;                                       !!!!!!!!!!!!!
	Array <Animal> theZoo;
	Array <Animal> theArray2;
	Animal * pAnimal;
	
	for (int i = 0; i < theArray.GetSize (); i++)
	{
		theArray2[i] = i;
		theArray[i] = i*2;
		pAnimal = new Animal (i*3);
		theZoo [i] = *pAnimal;
		delete pAnimal;
	}

	for (int j = 0; j < theArray.GetSize (); j++)
	{
		cout << theArray [j] << endl;
		cout << " now zoo " << endl;
		 theZoo[j].Display ();
	}
	theArray2 = theZoo;
	cout << " after equaling theArray2 = " << endl;
	cout << endl;
	for (int i = 0; i < theArray.GetSize (); i++)
		 theArray2 [i].Display ();
	char response;
	cin >> response;
	return 0;
}
при компиляции получаю следующие объявления
cpp(67): error C2440: =: невозможно преобразовать "const Array<T> *" в "Array<T> *const "

cpp(66): при компиляции функции-члена "Array<T> &Array<T>:perator =(const Array<T> &)" класса шаблон

cpp(80): см. ссылку на создание экземпляров класса шаблон при компиляции "Array<T>"



объявления ошибок показывают, на оператор =, но чтобы проще было найти, проблемные строки я выделил как !!!!!!!!!!!!!
если кто поможет, пожалуйста, объясните в чем я ошибаюсь, а не просто исправьте

Последний раз редактировалось ACE Valery; 11.05.2012 в 11:54.
monnzz вне форума Ответить с цитированием
Старый 10.05.2012, 22:45   #2
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

Оператор присваивания:
Код:
template <class T>
 Array <T> & Array <T>::operator= ( const Array & rhs)
 { 
 if (this == &rhs)
 return *this;
 delete [] pType;
 itsSize = rhs.GetSize ();
 pType = new T [itsSize];
 for (int i = 0; i < itsSize; i++)
 pType[i] = rhs [i];
 return *this;
 }
В прототипе ошибка: вместо оператора доступа к области видимости вы написали просто двоеточие.
Также ошибка в проверке на самоприсваивание - вы написали оператор присваивания вместо оператора проверки на равенство.
rmv240899 вне форума Ответить с цитированием
Старый 10.05.2012, 23:28   #3
Granus
С++
Форумчанин
 
Аватар для Granus
 
Регистрация: 22.09.2008
Сообщений: 791
По умолчанию

Цитата:
В прототипе ошибка: вместо оператора доступа к области видимости вы написали просто двоеточие.
У него : o заменилось на смайл, подозреваю)
Форматируйте код, будьте людьми.
Granus вне форума Ответить с цитированием
Старый 11.05.2012, 01:59   #4
SergeyCh
Пользователь
 
Регистрация: 22.04.2012
Сообщений: 27
По умолчанию

Здесь нет ошибок, кроме -

Код:
if (this = &rhs) !!!!!!!!!!!!!
return *this;
Правильно -

Код:
if (this == &rhs) 
return *this;
SergeyCh вне форума Ответить с цитированием
Старый 11.05.2012, 17:55   #5
rmv240899
Форумчанин
 
Регистрация: 18.02.2012
Сообщений: 155
По умолчанию

SergeyCh, кроме того, вместо оператора доступа к области видимости, было одно двоеточие. Так что ошибки в операторе две
rmv240899 вне форума Ответить с цитированием
Старый 11.05.2012, 18:53   #6
SergeyCh
Пользователь
 
Регистрация: 22.04.2012
Сообщений: 27
По умолчанию

>SergeyCh, кроме того, вместо оператора доступа к области видимости, было одно двоеточие. Так что ошибки в операторе две.

Очень сомневаюсь. При такой опечатке -
Код:
Array <T> & Array <T>:operator= ( const Array & rhs)
компилятор определяет место ошибки и выделяет красным цветом (подчёркивает) двоеточие.

Последний раз редактировалось SergeyCh; 11.05.2012 в 18:58.
SergeyCh вне форума Ответить с цитированием
Старый 11.05.2012, 20:58   #7
monnzz
Пользователь
 
Регистрация: 10.05.2012
Сообщений: 11
По умолчанию

Мужики, благодарю сердешно, действительно вместо оператора равенства написал оператор присваивания, двойное двоеточие было, просто заменилось тут на смайлик
в общем еще раз благодарю за помощь)
monnzz вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
operator== stenl1 Общие вопросы C/C++ 11 27.07.2011 06:38
ошибка: no match for ‘operator<<’ in ‘std::operator<< [with _Traits = std::char_traits<char> Critter Общие вопросы C/C++ 5 08.08.2010 23:38
PHP код в шаблонах CMS MrakSPb PHP 7 03.08.2010 15:16
Operator C++ EfiopianDIMON Общие вопросы C/C++ 1 13.12.2008 16:52