kääntäjä (gcc) valittaa itse tehdystä template tyypistä -> koko homma ei käänny. virheilmoitukset sain kukistettua yhteen
kääntäjä valittaa search_node luokasta, että se ei mukamas ole mikään tyyppi
Eli selittäisittekö miksi alin koodeista ei käänny ? tai kuinka ongelman voisi korjata.
Funktion käyttämä valmis template luokka:
Code: Select all
// (C) 2008 by Dark Code, Jarmo Tiitto
#include "NBTree_Node.h"
template<class T>
class search_node
{
public:
search_node<T>(Branch<T>* ptr, unsigned int index)
{
this->ptr = ptr;
this->index = index;
}
Branch<T>* ptr;
unsigned int index;
};
/* KUVAUS:
* Funktio jäsenten läpikäyntiin, käyttää pinona tavallista haaraumaa.
* jäsenet iteroidaan kiertämällä jatkuvastti vasemmalle
* Palauttaa true, kun kaikki mahdolliset jäsenet on käyty läpi.
* ensimmisenä parametrinä välitetään käytettävä "jäsen pino"
* toisena parametinä poinnteri nykyseen jäseneen
*/
template<class T>
bool IterateLeft(Branch<T>& stack, Branch<T>* current)
{
//annettu pino on tyhjä, aloitetaan alusta.
if(stack.Count_branches() == 0)
{
if(current != 0)
{
if(current->Branch_count()>1)
{
stack.Push_branch(new search_node(current, 1));
current = current.Get_branch(0);
}else
{
current = current.Get_branch(0);
}
}
return 0;
}else
{
}
Code: Select all
// (C) 2008 by Dark Code, Jarmo Tiitto
#include "NBTree_Node.h"
#define NDEBUG //debuggaus !!
#include <assert.h>
/* KUVAUS:
* Oletus konstruktori
*/
template<class T>
Branch<T>::Branch()
{
//std::cout<<"constructor called..."<<std::endl;
prev = 0;
base = 0;
}
/* KUVAUS:
* Kopio konstruktori
*/
template<class T>
Branch<T>::Branch(const Branch<T> ©)
{
//std::cout<<"copy constructor called..."<<std::endl;
prev = copy.prev;
Value = copy.Value;
Branch_list *cur = copy.base;
if(cur != 0)
{
base = new Branch_list;
base->data = cur->data;
Branch_list *tmp = base, *tmp2 = 0;
while(cur != 0)
{
tmp2 = new Branch_list;
tmp->next = tmp2;
tmp->data = cur->data;
tmp = tmp2;
cur = cur->next;
}
tmp->next = 0;
}else
{
base = 0;
}
}
/* KUVAUS:
* Konstruktori, joka luo ja alustaa tietyn määrän haaroja.
*/
template<class T>
Branch<T>::Branch(unsigned int branches)
{
//std::cout<<"constructor called..."<<std::endl;
prev = 0;
base = 0;
for(unsigned int i = 0; i < branches; i++ )
{
Push_branch(0);
}
}
/* KUVAUS:
* Destruktori, poistaa olemassa olevat haarat.
*/
template<class T>
Branch<T>::~Branch()
{
clear_branch_list();
assert(base == 0);
//std::cout<<"destructor called..."<<std::endl;
}
/* KUVAUS:
* Lisää uuden haaran listaan.
*/
template<class T>
void Branch<T>::Push_branch(Branch<T>* ptr = 0)
{
if(base == 0)
{
base = new Branch_list;
assert(base != 0);
base->data = ptr;
base->next = 0;
}else
{
Branch_list* tmp = base;
while(tmp->next != 0)
{
tmp = tmp->next;
}
Branch_list* new_itm = new Branch_list;
assert(new_itm != 0);
new_itm->data = ptr;
tmp->next = new_itm;
}
}
/* KUVAUS:
* Palauttaa haaran listasta.
*/
template<class T>
Branch<T>* Branch<T>::Get_branch(unsigned int index)
{
assert(base != 0);
Branch_list* tmp = base;
while(tmp->next != 0 && index != 0)
{
tmp = tmp->next;
index--;
}
return tmp->data;
}
/* KUVAUS:
* Asettaa haaran lisaan.
*/
template<class T>
void Branch<T>::Set_branch(unsigned int index, Branch<T>* ptr)
{
assert(base != 0);
Branch_list* tmp = base;
while(tmp->next != 0 && index != 0)
{
tmp = tmp->next;
index--;
}
tmp->data = ptr;
}
/* KUVAUS:
* Laskee haarojen määrän.
*/
template<class T>
unsigned int Branch<T>::Branch_count()
{
Branch_list* tmp = base;
unsigned int count = 0;
while(tmp != 0)
{
tmp = tmp->next;
count++;
}
return count;
}
/* KUVAUS:
* poistaa haaralistan (ei siis itse haaroja listasta).
*/
template<class T>
void Branch<T>::clear_branch_list()
{
if(base != 0)
{
Branch_list* cur = base;
Branch_list* del = 0;
while(cur->next != 0)
{
del = cur;
cur = cur->next;
delete del;
}
delete cur;
base = 0;
}
}
/* KUVAUS:
* Poistaa haaran listasta.
*/
template<class T>
void Branch<T>::Delete_branch(unsigned int index)
{
if(index > 0)
{
Branch_list *tmp = base, *del = 0, *tmp2 = 0;
while(tmp->next != 0 && index > 1)
{
tmp = tmp->next;
index--;
}
if(tmp->next != 0) del = tmp->next;
if(del != 0)
{
if(del->next !=0) tmp2 = del->next;
}
assert(tmp != tmp2);
tmp->next = tmp2;
delete del;
}else if(base->next != 0)
{
Branch_list* tmp = base->next;
delete base;
base = tmp;
}else if(base->next == 0)
{
base->data = 0;
delete base;
base = 0;
}
}
/* KUVAUS:
* Vaihtaa haarojen paikkaa keskenään.
*/
template<class T>
void Branch<T>::Swap_branches(unsigned int first, unsigned int second)
{
Branch_list *tmp = base, *swap1 = 0, *swap2 = 0;
unsigned int index = 0;
if(tmp == 0) return;
while(tmp->next != 0)
{
if(index == first) swap1 = tmp;
if(index == second) swap2 = tmp;
if(swap1 != 0 && swap2 != 0)
{
Branch<T>* btmp = swap1->data;
swap1->data = swap2->data;
swap2->data = btmp;
break;
}
index++;
tmp = tmp->next;
}
}
/* KUVAUS:
* Asettaa edellisen haaran.
*/
template<class T>
inline void Branch<T>::Set_previous(Branch<T>* ptr)
{
prev = ptr;
}
template<class T>
/* KUVAUS:
* Palauttaa edellisen haaran.
*/
inline Branch<T>* Branch<T>::Get_previous()
{
return prev;
}
/* KUVAUS:
* Asettaa haaran datan.
*/
template<class T>
inline void Branch<T>::Set_data(T& val)
{
Value = val;
}
/* KUVAUS:
* Palauttaa haaran datan.
*/
template<class T>
inline T& Branch<T>::Get_data()
{
return Value;
}
Code: Select all
// (C) 2008 by Dark Code, Jarmo Tiitto
#include "NBTree_Node.h"
template<class T>
class search_node
{
public:
search_node<T>(Branch<T>* ptr, unsigned int index)
{
this->ptr = ptr;
this->index = index;
}
Branch<T>* ptr;
unsigned int index;
};
/* KUVAUS:
* Funktio jäsenten läpikäyntiin, käyttää pinona tavallista haaraumaa.
* jäsenet iteroidaan kiertämällä jatkuvastti vasemmalle
* Palauttaa true, kun kaikki mahdolliset jäsenet on käyty läpi.
* ensimmisenä parametrinä välitetään käytettävä "jäsen pino"
* toisena parametinä poinnteri nykyseen jäseneen
*/
template<class T>
bool IterateLeft(Branch<T>& stack, Branch<T>* current)
{
//annettu pino on tyhjä, aloitetaan alusta.
if(stack.Count_branches() == 0)
{
if(current != 0)
{
if(current->Branch_count()>1)
{
stack.Push_branch(new search_node(current, 1));
current = current.Get_branch(0);
}else
{
current = current.Get_branch(0);
}
}
return 0;
}else
{
//lisää uber koodia :D
{
}
Onglema ratkesi ! olin sekoillut templaten parametrien kanssa.. kommennteja kaivataan silti.