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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 14.11.2010, 19:35   #1
Freddi Krjuger
Пользователь
 
Регистрация: 20.08.2010
Сообщений: 37
По умолчанию Шаблоны

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

Задание:
Разработать шаблонный класс Стек. Предусмотреть вариант хранения в стеке строк символов. Перегрузить операции +, -. *. В классе должен быть конструктор. Предусмотреть член-функцию для печати элементов класса.
ошибки:

1>d:\vs\shablon\shablon\shablon.cpp (123) : error C2804: binary 'operator +' has too many parameters
pp(127) : error C2079: 'operator +' uses undefined class 'Stack'
1>d:\vs\shablon\shablon\shablon.cpp (128) : error C2133: 'temp' : unknown size
1>d:\vs\shablon\shablon\shablon.cpp (128) : error C2512: 'Stack' : no appropriate default constructor available
1>d:\vs\shablon\shablon\shablon.cpp (129) : error C2110: '+' : cannot add two pointers
1>d:\vs\shablon\shablon\shablon.cpp (130) : error C2660: 'Stack<T>::Stack' : function does not take 1 arguments

Код:

#include "stdafx.h"
#include"iostream"
#include"cstring"
#define SIZE 10
using namespace std;
//////////////////////////////////
	template<typename T>
	class Stack
	{
		T stack[SIZE];
		int top;
	public:
		Stack(){top=0;}
		void push(T item);
		T pop();
		//Stack operator+(Stack a);
		friend Stack operator+(Stack a,Stack b);
	};
/////////////////////////////////
	Stack operator+(Stack a,Stack b)
	{
		Stack temp;
		temp=a.stack+b.stack;
		return temp;
	}

	template <typename T>
	void Stack<T>::push(T item)
	{
		if(top>=SIZE)
		{
			cout<<"Stack is full\n";
			return;
		}
		stack[top]=item;
		top++;
	}
	template<typename T>
	T Stack<T>::pop()
	{
		if(top<=0)
		{
			cout<<"\n Stack is empty\n";
			return 0;
		}
		top--;
		return stack[top];
	}
	void Stack <char>::push(char item)
	{
		if(top>=SIZE-1)
		{
			cout<<"\nStack is full\n";
			return;
		}
		stack[top]=item;
		top++;
	}
	int main()
	{
		Stack<int> st1;
		Stack<char>st2;
		Stack<double> st3;
		int i;

		for(i=0;i<8;i++)
		{
			st1.push(i+1);
			st2.push(char('A'+i));
			st3.push(i+1.1);
		}

		cout<<"int:\n";
		for(i=0;i<8;i++)
			cout<<st1.pop()<<" ";
		cout<<endl;


		cout<<"char: \n";
		for(i=0;i<8;i++)
			cout<<st2.pop()<<" ";
		cout<<endl;


		cout<<"double:\n";
		for(i=0;i<8;i++)
		cout<<st3.pop()<<" ";

		return 0;
	}

Последний раз редактировалось Freddi Krjuger; 14.11.2010 в 19:45.
Freddi Krjuger вне форума Ответить с цитированием
Старый 14.11.2010, 19:43   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,709
По умолчанию

Код:
Stack operator+(Stack a,Stack b)
Зачем тут второй параметр? Вот и компилятор не понимает...
p51x вне форума Ответить с цитированием
Старый 14.11.2010, 19:45   #3
Freddi Krjuger
Пользователь
 
Регистрация: 20.08.2010
Сообщений: 37
По умолчанию

оператор+ перегружена как дружественная
Freddi Krjuger вне форума Ответить с цитированием
Старый 14.11.2010, 19:48   #4
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Во-первых, зачем вам две реализации оператора +?
Если как член класса, то как-то так:
Код:
template<typename T>
class Stack
{
	T stack[SIZE];
	int top;
public:
	Stack(){top=0;}
	void push(T item);
	T pop();
	Stack<T> operator + (const Stack<T> &aStack) const;
};

// ...

template <class T>
Stack<T> Stack<T>::operator + (const Stack<T> &aStack) const
{
	// ...
}
Если не как член, то как-то так:
Код:
template<typename T>
class Stack
{
	T stack[SIZE];
	int top;
public:
	Stack(){top=0;}
	void push(T item);
	T pop();

	friend template <class T>
	         Stack<T> operator + (const Stack<T> &aStack);
};

// ...

template <class T>
Stack<T> operator + (const Stack<T> &aStack)
{
	// ...
}
Если я не ошибаюсь
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 14.11.2010 в 19:50.
Syuf вне форума Ответить с цитированием
Старый 14.11.2010, 20:04   #5
Freddi Krjuger
Пользователь
 
Регистрация: 20.08.2010
Сообщений: 37
По умолчанию

работает спасибо),даже не думал о таком варианте.Теперь другая ошибка=( как только пытаюсь использовать оператор выходит ошибка
1>d:\vs\shablon\shablon\shablon.cpp (193) : error C2679: binary '+' : no operator found which takes a right-hand operand of type 'Stack<T>' (or there is no acceptable conversion)

Код:
#include "stdafx.h"
#include"iostream"
#include"cstring"
#define SIZE 10
using namespace std;
//////////////////////////////////
	template<typename T>
	class Stack
	{
		T stack[SIZE];
		int top;
	public:
		Stack(){top=0;}
		void push(T item);
		T pop();
		Stack<T> operator + (const Stack<T> &aStack) const;
		//friend template <class T>
			//Stack<T> operator + (const Stack<T> &aStack);
	};
/////////////////////////////////
	
	template <class T>
Stack<T> Stack<T>::operator + (const Stack<T> &aStack) const
	{
		Stack <char>temp;
		temp=this->stack+aStack.stack;
		return temp;
	}

	template <typename T>
	void Stack<T>::push(T item)
	{
		if(top>=SIZE)
		{
			cout<<"Stack is full\n";
			return;
		}
		stack[top]=item;
		top++;
	}
	template<typename T>
	T Stack<T>::pop()
	{
		if(top<=0)
		{
			cout<<"\n Stack is empty\n";
			return 0;
		}
		top--;
		return stack[top];
	}
	void Stack <char>::push(char item)
	{
		if(top>=SIZE-1)
		{
			cout<<"\nStack is full\n";
			return;
		}
		stack[top]=item;
		top++;
	}
	int main()
	{
		Stack<int> st1;
		Stack<char>st2;
		Stack<double> st3;
		Stack<char> x;
		int i;

		for(i=0;i<8;i++)
		{
			st1.push(i+1);
			st2.push(char('A'+i));
			st3.push(i+1.1);
		}

		cout<<"int:\n";
		for(i=0;i<8;i++)
			cout<<st1.pop()<<" ";
		cout<<endl;


		cout<<"char: \n";
		for(i=0;i<8;i++)
			cout<<st2.pop()<<" ";
		cout<<endl;
		x=st1+st2;//вызов оператора +

		cout<<"double:\n";
		for(i=0;i<8;i++)
		cout<<st3.pop()<<" ";

		return 0;
	}
Freddi Krjuger вне форума Ответить с цитированием
Старый 14.11.2010, 20:53   #6
Syuf
Форумчанин
 
Аватар для Syuf
 
Регистрация: 02.02.2010
Сообщений: 599
По умолчанию

Логично, вы вызываете его для разных типов: Stack<int> + Stack<char>!
Если вам уж это черезчур надо, то следует делать уже явные специализации классов (после обычных):
Код:
template<>
class Stack<int>
{
	int stack[SIZE];
	int top;
public:
	Stack(){top=0;}
	void push(int item);
	int pop();
	Stack<int> operator + (const Stack<char> &aStack) const;
};

// Соответствующая реализация...
Или еще как-то поэксперементировать, например, с функциями преобразования:
Код:
template<typename T>
class Stack
{
	T stack[SIZE];
	int top;
public:
	Stack(){top=0;}
	void push(T item);
	T pop();
	Stack<T> operator + (const Stack<T> &aStack) const;
	operator Stack<int>() const;
};

// ...

template <class T>
Stack<T>::operator Stack<int>() const
{
	Stack<int> stack;
	// Копируем все элементы this в stack
	return stack;
}
Но я не уверен, что это будет работать.
"Лишь то читается легко, что написано с трудом; что в час написано, то в час и позабыто."

Последний раз редактировалось Syuf; 14.11.2010 в 20:57.
Syuf вне форума Ответить с цитированием
Старый 14.11.2010, 20:55   #7
Freddi Krjuger
Пользователь
 
Регистрация: 20.08.2010
Сообщений: 37
По умолчанию

спасибо большое попробую.
Freddi Krjuger вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Шаблоны классов __Demon__ C++ Builder 11 03.03.2010 01:04
Шаблоны С++ Secc Помощь студентам 4 27.12.2009 17:35
Шаблоны C++ Viamy Помощь студентам 0 27.12.2009 16:10
Шаблоны, Си++ Нataша Помощь студентам 1 11.12.2009 01:35
Шаблоны bondik Общие вопросы C/C++ 10 04.05.2008 09:50