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

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

Вернуться   Форум программистов > IT форум > Помощь студентам
Регистрация

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 09.08.2010, 22:23   #1
NecroArt
 
Регистрация: 09.08.2010
Сообщений: 8
По умолчанию Перегрузка бинарных арифметических операторов шаблона класса (C++)

Здравствуйте. Хочу написать шаблон класса для работы со множеством, в котором нужно реализовать дизъюнкция (оператор +) и конъюнкцию (оператор *). Пишу:
Код:
template <class T>
	class MASS
	{
	private:
		struct Node //описание элемента множества
		{
			T DATA; //данные, хранящиеся в элементе множества
			Node *next, *prev, *beg, *end;	//указатели на предыдущий и следующий элементы двусвязного списка; указатели на начало и конец списка
			bool status;	//true, если элемент содержит занесённые данные; false, если данные не
							//добавлялись
		};
		unsigned short int k; //количество элементов множества
		Node mass; //элементы множества
	public:
		MASS (T n/*int n*/);	//при вызове создаёт вектор mass заданной размерности n; 
					//при отсутствующем или отрицательном параметре - размерности 5
		~MASS();	//деструктор
		MASS (const MASS &first_mass); //конструктор копирования
		MASS operator+ (MASS second_mass)	//возвращает множество, являющееся результатам
											//дизъюнкции заданных множеств

MASS operator+ (T new_element); //возвращает множество, являющееся результатам дизъюнкции
										//заданного множества и элемента
		
		MASS operator* (MASS second_mass);	//возвращает множество, являющееся результатам
											//коньюнкции заданных множеств
		
		bool operator= (MASS second_mass); //конструктор присваивания

...

template <class T> 
/*Ошибка 1*/		MASS MASS<T>:: operator+ (MASS second_mass)
			{
/*Ошибка 2*/		}

template <class T> 
		MASS MASS<T>:: operator+ (T second_mass)
			{
/*Ошибка 3*/		}


	template <class T> 
		 MASS MASS <T>:: operator* (MASS second_mass)
			{
/*Ошибка 4*/		}

template <class T> 
		bool MASS<T>:: operator= (MASS second_mass)
			{
				cbj;
			}
В результате компиляции:
Ошибка 1 error C2955: MASS: для использования класса шаблон требуется список аргументов шаблон
Ошибка 2 error C2244: MASS<T>:perator +: не удается сопоставить определение функции существующему объявлению
Ошибка 3 error C2244: MASS<T>:perator +: не удается сопоставить определение функции существующему объявлению
Ошибка 4 error C2244: MASS<T>:perator *: не удается сопоставить определение функции существующему объявлению

Гугль не помог. Пробовал сделать, как рекомендовали в <a href="http://programmersforum.ru/showthread.php?t=31855">этой теме</a> - всё-равно не получается. Помогите, пожалуйста

Последний раз редактировалось NecroArt; 10.08.2010 в 01:37.
NecroArt вне форума Ответить с цитированием
Старый 10.08.2010, 05:23   #2
creator32
Пользователь
 
Регистрация: 13.11.2008
Сообщений: 18
Хорошо

Ошибка была на уровне синтаксиса. Кратко, при вынесении определения функции за пределы класса, она возвращала не "шаблонизированный" объект. А именно, пыталась вернуть объект класса MASS вместо MASS<T>.

PS : Пришлось подстроить код для выявления ошибки. Кроме этого, Node был вынесен за пределы класса для читабельности.

Код:
template <class T>
struct Node {
	T DATA;
	Node *next, *prev, *beg, *end;
	bool status;
};

template <class T>
class MASS {
	private:
		unsigned short int k;
		Node mass;
	public:
		MASS (T n){};
		~MASS(){};
		MASS (const MASS &first_mass){};
		MASS operator+ (MASS second_mass){};
		MASS operator+ (T new_element){};
		MASS operator* (MASS second_mass);
		bool operator= (MASS second_mass);
};

template <class T>
bool MASS<T>::operator=( MASS second_mass ) {

}

template <class T>
MASS<T> MASS<T>::operator*( MASS second_mass ) {

}
creator32 вне форума Ответить с цитированием
Старый 10.08.2010, 21:31   #3
NecroArt
 
Регистрация: 09.08.2010
Сообщений: 8
По умолчанию

Спасибо, работает!

Теперь возникла новая проблема: в перегруженном операторе сложения объединяются два множества, или элемента... В общем, в результате возвращается новое множество. У этого множества есть указатели типо Node на запись Node:
Код:
struct Node //описание элемента множества
{
   T DATA; //данные, хранящиеся в элементе множества
   Node *next, *prev;	//указатели на предыдущий и следующий элементы двусвязного списка
};
Это указатели beg и end. Оператор сложения возвращает множество (то есть результат в самой функции, перегружающей оператор), в котором end->next равен 0x00000000, как и задумано. Но когда это результат передаётся в оператор присваивания, то у этого возвращаемого множества тот же самый end->next имеет результат 0xcdcdcdcd. Подскажите, как такое может быть

Последний раз редактировалось Stilet; 25.08.2010 в 09:52.
NecroArt вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Перегрузка операторов(С++) Сергей AfeR Помощь студентам 0 16.06.2010 18:34
Перегрузка операторов raspberry Общие вопросы C/C++ 2 06.04.2010 00:19
Перегрузка операторов. Macb3th Общие вопросы C/C++ 5 01.04.2010 21:14
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15