Witam wszystkich!
To jest mój pierwszy post, więc od razu proszę o wyrozumiałość. ;)
Mam na zaliczenie do zaimplementowania tablicę asocjacyjną oraz jej wzorzec przy pomocy szablonów. bez szablonów kod jest dobry, kompiluje się i działa, jak powinien. Jednak po dodaniu template pojawiło się dużo błędów. Większość już udało mi się usunąć, ale nadal zostało mi kilka i nie mam pojęcia, czemu one się pojawiają i jak im zaradzić. Wstawiam mój kod oraz pojawiające się błędy. Z góry dziękuję za pomoc. Będę bardzo wdzięczny za wyjaśnienie, jak sobie radzić z takimi sytuacjami.
#include<iostream>
#include<cstring>
#include<cctype>
using namespace std;
template <class klasa1, class klasa2>
class Node{
public:
klasa1 key;
Node<klasa1, klasa2> *next;
klasa2 val;
Node(klasa1 key = "", klasa2 val = 0) :key(key), next(0), val(val){};
public:
friend class AssocTab;
};
template <class klasa1, class klasa2>
class AssocTab{
public:
Node<klasa1, klasa2> *head;
Node<klasa1, klasa2> *tail;
virtual bool exist(klasa1 key){
if (!head) return 0;
Node <klasa1, klasa2>*next=head;
do{
if (next->key == key) return 1;
next = next->next;
} while (next);
return 0;
};
virtual int& find(klasa1 key){
Node <klasa1, klasa2>*next = head;
do{
if (next->key == key) return next->val;
next = next->next;
} while (next);
return head->val;
};
int& create(klasa1 key, klasa2 val = 0);
void clear();
void coppy(const AssocTab &rref);
public:
AssocTab();
AssocTab(AssocTab &arg);
~AssocTab();
AssocTab<klasa1, klasa2>& operator=(const AssocTab &arg);
int& operator[](klasa1 key);
void pokaz(){
if (head == 0)return;
Node<klasa1, klasa2> *ptr = head;
while (ptr){
cout << (ptr->key) << " = " << (ptr->val) << endl;
ptr = ptr->next;
}
cout << endl;
};
};
template <class klasa1, class klasa2>
class AssocTabN :public AssocTab<klasa1, klasa2>{
public:
Node<klasa1, klasa2> *head;
int& operator[](klasa1 key);
virtual int& find(klasa1 key){
Node<klasa1, klasa2> *next = head;
do{
if (stricmp(next->key.c_str(),key.c_str())==0) return next->val;
next = next->next;
} while (next);
return head->val;
}
virtual bool exist(klasa1 key){
if (!head) return 0;
Node<klasa1, klasa2> *next=head;
do{
if (stricmp(next->key.c_str(),key.c_str())==0) return 1;
next = next->next;
} while (next);
return 0;
}
};
template <class klasa1, class klasa2>
int& AssocTab<klasa1,klasa2>::create(klasa1 key, klasa2 val ){
if (!head){
tail=head = new Node<klasa1, klasa2>(key,val);
return head->val;
}
else{
tail->next = new Node<klasa1, klasa2>(key,val);
tail = tail->next;
return tail->val;
}
}
template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2> ::clear(){
if (head == 0)return;
Node<klasa1, klasa2> *ptr = head, *nptr;
while (ptr){
nptr = ptr->next;
delete ptr;
ptr = nptr;
}
head = tail = 0;
}
template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2>::coppy(const AssocTab &rref){
if (rref.head == 0)return;
create(rref.head->key, rref.head->val);
Node<klasa1, klasa2> *argptr = rref.head->next;
while (argptr){
create(argptr->key, argptr->val);
argptr = argptr->next;
}
}
template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::AssocTab(){
head = tail=0;
}
template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::AssocTab(AssocTab &arg){
head = 0;
if (arg.head == 0)return;
coppy(arg);
}
template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>::~AssocTab(){
clear();
}
template <class klasa1, class klasa2>
AssocTab<klasa1, klasa2>& AssocTab<klasa1, klasa2>::operator = (const AssocTab &arg){
clear();
if (arg.head == 0)return *this;
coppy(arg);
return *this;
}
template <class klasa1, class klasa2>
int& AssocTab<klasa1, klasa2>::operator[](klasa1 key){
if (exist(key)) return find(key);
return create(key);
}
/*template <class klasa1, class klasa2>
void AssocTab<klasa1, klasa2>::pokaz(){
if (head == 0)return;
Node<klasa1, klasa2> *ptr = head;
while (ptr){
cout << (ptr->key) << " = " << (ptr->val) << endl;
ptr = ptr->next;
}
cout << endl;
}*/
template <class klasa1, class klasa2>
int& AssocTabN<klasa1, klasa2>::operator[](klasa1 key){
klasa1 lower=key;
if (exist(lower)) return find(lower);
return this->create(lower);
}
int main(){
AssocTab <string, int>a,*d;
a["styczen"] = 31;
a["luty"] = 29;
a["Luty"] = 11;
a["lUtY"] = 322;
a.pokaz();
AssocTabN <string, int>b,c;
b["styczen"] = 31;
b["luty"] = 29;
b["Luty"] = 11;
b["lUtY"] = 322;
b["maj"] = 31;
b["Zima"] = 666;
b.pokaz();
d = &b;
cout << (*d)["lUty"] << endl;
b = c;
c["lUtY"] = 123;
b["lUtY"] = 456;
c.pokaz();
b.pokaz();
AssocTab<string, int> e;
a["styczen"] = 5531;
e.pokaz();
// system("PAUSE");
return 0;
}
Błędy:
53 37 required from 'void AssocTab<klasa1, klasa2>::pokaz() [with klasa1 = std::basic_string<char>; klasa2 = int]'
179 13 required from here
12 16 [Error] template argument required for 'class AssocTab'
28 recipe for target 'main.o' failed
Jeszcze raz dziękuję za pomoc.
Pozdrawiam,
Makieć