[vc++ 2008] specjaloizacja jednej metody szablonu klasy

0

fragment plik naglowkowego z ogolnym szablonem klasy 'lista':

#pragma once

#include <iostream>
#include "prostokat.h"

using namespace std;

template <class typ>
class lista
{
	struct element
	{
		typ obiekt;
		element* next;
	};
	
private:
	element* glowa;
public:
	lista();
	void operator+=(typ& o);
	void wyczysc();
	void wyswietl();
	int dlugosc();
};

void lista<typ>::operator+=(typ& o)
{
	element* wsk=glowa;

	if (wsk==NULL)	//nie bylo na liscie nic
	{
		glowa=new element;
		glowa->obiekt=o;
		glowa->next=NULL;
		return;
	}

	if (wsk->next==NULL)	//na liscie byl 1 element
	{
		if (wsk->obiekt<o)
		{
			wsk->next=new element;
			wsk->next->obiekt=o;
			wsk->next->next=NULL;
			return;
		}
		else
		{
			wsk=new element;
			wsk->obiekt=o;
			wsk->next=glowa;
			glowa=wsk;
			return;
		}
	}

	while(wsk->next!=NULL)	//sukanie pierwszego elementu niemniejszego od wstawianego elementu
	{
		if (wsk->next->obiekt<o)
			wsk=wsk->next;
		else
			break;
	}

	//na liscie bylo wiele elementow:
	if (wsk->next==NULL)	//wsk zatrzymal sie na ostatnim elemencie
	{
		wsk->next=new element;
		wsk->next->obiekt=o;
		wsk->next->next=NULL;
	}
	else if (wsk==glowa)	//wsk zatrzymal sie na pierwszym elemencie
	{
		if (wsk->obiekt<o)	//nalezy wstawic za pierwszym elementem
		{
			element* tmp=wsk->next;
			wsk->next=new element;
			wsk->next->obiekt=o;
			wsk->next->next=tmp;
		}
		else	//nalezy wstawic przed pierwszym elementem
		{
			wsk=new element;
			wsk->obiekt=o;
			wsk->next=glowa;
			glowa=wsk;
		}
	}
	else	//wsk zatrzymal sie na nieskrajnym elemencie
	{
		element* tmp=wsk->next;
		wsk->next=new element;
		wsk->next->obiekt=o;
		wsk->next->next=tmp;
	}
}

plik zawierajacy specjalizacje metody nalezacej do klasy lista<prostokat>:

#include "lista.h"

//------------------specjalizacje_szablonu:--------------------------

template <>
void lista<prostokat>::operator+=(prostokat& p)
{
	element* wsk=glowa;

	if (wsk==NULL)	//nie bylo na liscie nic
	{
		glowa=new element;
		glowa->obiekt=p;
		glowa->next=NULL;
		return;
	}

	if (wsk->next==NULL)	//na liscie byl 1 element
	{
		if (wsk->obiekt.pole()<p.pole())
		{
			wsk->next=new element;
			wsk->next->obiekt=p;
			wsk->next->next=NULL;
			return;
		}
		else
		{
			wsk=new element;
			wsk->obiekt=p;
			wsk->next=glowa;
			glowa=wsk;
			return;
		}
	}

	while(wsk->next!=NULL)	//sukanie pierwszego elementu niemniejszego od wstawianego elementu
	{
		if (wsk->next->obiekt.pole()<p.pole())
			wsk=wsk->next;
		else
			break;
	}

	//na liscie bylo wiele elementow:
	if (wsk->next==NULL)	//wsk zatrzymal sie na ostatnim elemencie
	{
		wsk->next=new element;
		wsk->next->obiekt=p;
		wsk->next->next=NULL;
	}
	else if (wsk==glowa)	//wsk zatrzymal sie na pierwszym elemencie
	{
		if (wsk->obiekt.pole()<p.pole())	//nalezy wstawic za pierwszym elementem
		{
			element* tmp=wsk->next;
			wsk->next=new element;
			wsk->next->obiekt=p;
			wsk->next->next=tmp;
		}
		else	//nalezy wstawic przed pierwszym elementem
		{
			wsk=new element;
			wsk->obiekt=p;
			wsk->next=glowa;
			glowa=wsk;
		}
	}
	else	//wsk zatrzymal sie na nieskrajnym elemencie
	{
		element* tmp=wsk->next;
		wsk->next=new element;
		wsk->next->obiekt=p;
		wsk->next->next=tmp;
	}
}

main:

#include "lista.h"
#include "punkt.h"
#include "prostokat.h"

void main()
{
        lista<prostokat> prostokaty;
	prostokat pr1(1,2);

	prostokaty+=pr1;
	
	getchar();
}

problem:
kompilator pokazuje błędy w kodzie klasy ogolnej przeciez powinien korzystac z kodu operator+= dla klasy lista<prostokat>

Error 1 error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 48

Error 2 error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 48

Error 3 error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 48

Error 4 error C2676: binary '<' : 'prostokat' does not define this operator or a conversion to a type acceptable to the predefined operator d:\doc\studia\pk\pk4\lab5\lab5\lista.h 48

Error 5 error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 67

Error 6 error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 67

Error 7 error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 67

Error 8 error C2676: binary '<' : 'prostokat' does not define this operator or a conversion to a type acceptable to the predefined operator d:\doc\studia\pk\pk4\lab5\lab5\lista.h 67

Error 9 error C2784: 'bool std::operator <(const std::reverse_iterator<_RanIt> &,const std::reverse_iterator<_RanIt2> &)' : could not deduce template argument for 'const std::reverse_iterator<_RanIt> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 82

Error 10 error C2784: 'bool std::operator <(const std::_Revranit<_RanIt,_Base> &,const std::_Revranit<_RanIt2,_Base2> &)' : could not deduce template argument for 'const std::_Revranit<_RanIt,_Base> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 82

Error 11 error C2784: 'bool std::operator <(const std::pair<_Ty1,_Ty2> &,const std::pair<_Ty1,_Ty2> &)' : could not deduce template argument for 'const std::pair<_Ty1,_Ty2> &' from 'prostokat' d:\doc\studia\pk\pk4\lab5\lab5\lista.h 82

Error 12 error C2676: binary '<' : 'prostokat' does not define this operator or a conversion to a type acceptable to the predefined operator d:\doc\studia\pk\pk4\lab5\lab5\lista.h 82

0

aha
wiem ze lepiej jest zrobic operator < dla klasy prostokat ale kod ten piszę w celach dydaktycznych

0

moze dac szablon i specjalizacje w jednym pliku?

0

gdy tak robilem to tez sie nie kompilowalo i sie meczylem z tym kilka godzin

w vc++ deklaracja i definicja szablonu musza byc w jednym pliku dlatego specjalizacje tez dawalem w tym samym i nie dzialalo, dopiero gdy przenioslem do innego to zaczelo kompilowac (do czasu az w mainie uzylem operatora += co spowodowalo wystapienie bledow wspomnianych przeze mnie na poczatku)

1 użytkowników online, w tym zalogowanych: 0, gości: 1