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

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

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

Восстановить пароль

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

Ответ
 
Опции темы Поиск в этой теме
Старый 29.05.2009, 21:41   #11
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию

Нужна помощь по шаблонам класса. Никак не пойму, в чем ошибка, вот что выдает компилятор:
Цитата:
[C++ Error] template_date.cpp(23): E2080 'data<VType>:perator <<(ostream &,data<VType> &)' must be declared with one parameter
Вот исходники (в двух файлах):

Файл template_date.cpp( (собственно само определение класса)
Код:
//---------------------------------------------------------------------------
#pragma hdrstop
#include <iostream.h>
#include <iomanip.h>

#pragma argsused

template <class VType>
class data
{
	VType day;
	VType month;
	VType year;

	public:
	static int t; //тип даты
	static enum {JAN=1,FEB,MAR,APR,MAY,JUN,JUL,AUG,SEP,OCT,NOV,DEC}mon;
	data(VType d=1, VType m=1,VType=1);
	~data(){};
	ostream& operator << (ostream& out, data& c)
	{
    	switch (c.t)
		{
			case 1: return out<<setw(2)<<setfill('0')<<c.day<<'.'
					<<setw(2)<<setfill('0')<<c.month<<'.'
					<<setw(4)<<setfill('0')<<c.year;
			case 2: return out<<setw(2)<<setfill('0')<<c.month<<'/'
					<<setw(2)<<setfill('0')<<c.day<<'/'
					<<setw(4)<<setfill('0')<<c.year;
		}
		return out;
	};
	istream& operator >> (istream& in, data& c)
	{
		char str[100],*tPtr,c1;
		cin>>c.day>>c1>>c.month>>c1>>c.year;
		if ((c.month > 12) || (c.month <= 0))
		{
		while ((c.month > 12) || (c.month <= 0))
			{
				cout << "Input month <= 12! \nMonth: ";
				cin >> c.month;
			}
		}
		if (c.month==c.JAN || c.month==c.MAR || c.month==c.MAY || c.month==c.JUL || c.month==c.AUG || c.month ==c.OCT || c.month ==c.DEC)
		{
			while (c.day > 31)
			{
				cout << "Input day<=31! \nDay: ";
				cin >> c.day;
			}
		}
		if (c.month ==c.APR || c.month==c.JUN || c.month == c.SEP || c.month == c.NOV)
		{
			while (c.day >30)
			{
				cout << "Input day<=30! \nDay: ";
				cin >> c.day;
			}
		}
		if (c.year/4.!=0 && c.month==c.FEB)
		{
			while (c.day>28)
			{
				cout<< "Input day <= 28! \nDay: ";
				cin >> c.day;
			}
		}
		if (c.year/4.==0 && c.month==c.FEB)
		{
			while (c.day > 29)
			{
				cout<<"Input day<=29! \nDay: ";
				cin>>c.day;
				}
		}
		return in;
	};
	bool operator == (const data&, const data&)
	{
		if ((A.day==B.day) && (A.month==B.month) && (A.year==B.year)) return true;
		else return false;
	}


	data operator - (data d1, data d2)
	{
	data<VType> d3;
	d3.year=(d1.year-d2.year);

	if((d1.month-d2.month)<0)
		{d3.month=((d1.month-d2.month)+12);d3.year-=1;}
	else d3.month=(d1.month-d2.month);

	if(((d1.day-d2.day)<0) && (d3.month=d3.JAN))
		{d3.day=((d1.day-d2.day)-31);d3.month-=1;}

	if(((d3.year%4)==0)&&(d3.month==d3.MAR)&&((d1.day-d2.day)<0))
		{d3.month-=1;d3.day=(d1.day-d2.day+29);}

	if(((d3.year%4)!=0)&&(d3.month==d3.MAR)&&((d1.day-d2.day)<0))
		{d3.month-=1;d3.day=(d1.day-d2.day+28);}

	if(((d1.day-d2.day)<0)&&((d3.month==d3.APR)||(d3.month==d3.AUG)||(d3.month==d3.SEP)||
	(d3.month==d3.NOV)))
		{d3.month-=1; d3.day=(d1.day-d2.day+31);}

	if(((d1.day-d2.day)<0)&&((d3.month==d3.MAY)||(d3.month==d3.JUL)||(d3.month==d3.OCT)||
	(d3.month==d3.DEC)))
		{d3.month-=1;d3.day=(d1.day-d2.day+30);}

	return d3;
	}
	void increase(VType d);  //увеличение даты на d дней
	void decrease(VType d); //уменьшение даты на d дней


};

template <class VType>
data<VType>::data(VType d, VType m, VType y)
{
	day = d;
	month = m;
	year = y;
}

template <class VType>
void data<VType>::increase (VType d)
{
	while (d!=0)
	{
		if (month==JAN||month==MAR||month==MAY||month==JUL||month==AUG||month==OCT||month==DEC) {
		if (d<(31-day+1)) {day+=d;d=0;}
		else {d-=(31-day+1);
			 day=1;
			 if (month==DEC) {month=JAN;year++;}
			 else month++;
			 }
	}
	if (month==APR||month==JUN||month==SEP||month==NOV)
	{
		if (d<(30-day+1)) {day+=d;d=0;}
		else {d-=(30-day+1);
			day=1;
			month++;}
	}
	if (year/4.!=0 && month==FEB)
		if (d<(28-day+1)) {day+=d;d=0;}
		else {d-=(28-day+1);
			day=1;
			month++;
			}
	if (year/4.==0 && month==FEB)
		if (d<(29-day+1)) {day+=d;d=0;}
		else {d-=(29-day+1);
			day=1;
			month++;
			}
	}
}

template <class VType>
void data<VType>::decrease (VType d)
{
	while (d!=0)
	{
	if (d<day) {day-=d;d=0;}
	else {
		if (month==FEB||month==APR||month==JUN||month==AUG||month==SEP||month==NOV)
		{d-=day;
		day=31;
		month--;
		if (d<day) continue;}
		 
		if (month==MAY||month==JUL||month==OCT||month==DEC)
		{d-=day;
		day=30;
		month--;
		if (d<day) continue;}

		if (month==JAN)
		{d-=day;
		day=31;
		month=DEC;
		year--;
		if (d<day) continue;}

		if (year/4.!=0 && month==MAR)
		{d-=day;
		day=28;
		month--;
		if (d<day) continue;}

		if (year/4.==0 && month==MAR)
		{d-=day;
		day=29;
		month--;
		if (d<day) continue;}
		}
	}
}
template <class VType>
int data<VType>::t;
Roomper вне форума Ответить с цитированием
Старый 29.05.2009, 21:42   #12
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию

Файл unit1.cpp (главная функия main())
Код:
#include "template_date.cpp"
#include <iostream.h>
#include <iomanip.h>
#pragma argsused
int main(int argc, char* argv[])
{
	cout << "Please make a choose the format of data: \n";
	cout << "1: DD.MM.YYYY \n2: MM/DD/YYYY \n3: DD-mon-YYYY \n";
	cin >> data<int>::t;
	getchar();
	if(data<int>::t == 1) cout << "\nEnter two dates in a format  DD.MM.YYYY: \n";
	else if (data<int>::t == 2) cout << "\nEnter two dates in a format  MM/DD/YYYY: \n";
	data<int> u,r;
	cin >> u >> r;
	cout << endl<<"Your dates: \n";
	cout << u << endl << r;
	if (u == r) cout << "\nDates are equal";
	else cout << "\nDates aren't equal";
	cout << endl;
	u.increase(456);
           r.decrease(56);
	cout << u << endl << r << endl;
	data<int> v;
	v = u-r;
	cout << endl;
	cout << u << " - " << r << " = " << v << endl;
	getchar(); getchar();
	return 0;
}
Roomper вне форума Ответить с цитированием
Старый 29.05.2009, 22:54   #13
Sazary
В тени
Старожил
 
Аватар для Sazary
 
Регистрация: 19.12.2008
Сообщений: 5,788
По умолчанию

Roomper, объявите перегруженные операторы как friend.
То есть, например:
Код:
friend istream& operator >> (istream& in, data& c)
Вполне очевидно, чтобы что-то понять, необходимо книги читать.
Не нужно плодить бессмысленных тем. Вас Поиск избавит от многих проблем.

___________________________________ ___________________________________ _______
[=Правила форума=]_____[Поиск]_____[Литература по С++]____[Литература. Паскаль]
Sazary вне форума Ответить с цитированием
Старый 30.05.2009, 08:36   #14
Roomper
Пользователь
 
Регистрация: 12.05.2008
Сообщений: 13
По умолчанию

Я делал так раньше, но в лекциях у нас написано, что лучше их объявить внутри класса. Ну ладно, вернул как было раньше с некоторыми поправками, и вот что теперь выдает компилятор:
Цитата:
[Linker Error] Error: Unresolved external 'operator >>(std::basic_istream<char, std::char_traits<char> >&, data<int>&)' referenced from C:\С++ PROJECT\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external 'operator ==(const data<int>&, const data<int>&)' referenced from C:\С++ PROJECT\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external 'operator -(data<int>, data<int>)' referenced from C:\С++ PROJECT\DEBUG_BUILD\UNIT1.OBJ
[Linker Error] Error: Unresolved external 'operator <<(std::basic_ostream<char, std::char_traits<char> >&, data<int>&)' referenced from C:\С++ PROJECT\DEBUG_BUILD\UNIT1.OBJ
P.S. Исходники в прикрепленном файле.
Вложения
Тип файла: rar С++ Project.rar (1.9 Кб, 13 просмотров)
Roomper вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Задача в Делфи, классы. Катерина_Ио Фриланс 3 18.05.2009 14:10
Перегрузка операторов <<, >>, +=, +. class data Наташенька Общие вопросы C/C++ 2 02.05.2009 10:04
Перегрузка операторов (С++) Перчитель Помощь студентам 1 03.12.2008 18:46
Перегрузка операторов, Организация перегрузки операторов chagin_yav Помощь студентам 2 12.05.2008 09:15