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