hello,
I am trying to write a program that uses two templated classes, one call Rek, which represents a record; and another called Table, which consists of an array of pointers to instances of Rek -- basically, a table for storing data.
I'm getting an error at compile time that seems to indicate that it's trying to convert a pointer to a variable, but i can't understand why.
the error is:
rek.t: In constructor `Rek<K, D>::Rek() [with K = Word, D = Word]':
table.t:41: instantiated from `Table<K, D>::Table() [with K = Word, D = Word]'
p3.cc:25: instantiated from here
rek.t:32: error: invalid conversion from `Word*' to `char'
rek.t:32: error: initializing argument 1 of `Word::Word(cha r)'
rek.t:33: error: invalid conversion from `Word*' to `char'
rek.t:33: error: initializing argument 1 of `Word::Word(cha r)'
The Table class appears as follows, with the erroring line commented:
and the Rek class as follows:
Thank you
I am trying to write a program that uses two templated classes, one call Rek, which represents a record; and another called Table, which consists of an array of pointers to instances of Rek -- basically, a table for storing data.
I'm getting an error at compile time that seems to indicate that it's trying to convert a pointer to a variable, but i can't understand why.
the error is:
rek.t: In constructor `Rek<K, D>::Rek() [with K = Word, D = Word]':
table.t:41: instantiated from `Table<K, D>::Table() [with K = Word, D = Word]'
p3.cc:25: instantiated from here
rek.t:32: error: invalid conversion from `Word*' to `char'
rek.t:32: error: initializing argument 1 of `Word::Word(cha r)'
rek.t:33: error: invalid conversion from `Word*' to `char'
rek.t:33: error: initializing argument 1 of `Word::Word(cha r)'
The Table class appears as follows, with the erroring line commented:
Code:
#ifndef TABLE_T #define TABLE_T #include"rek.t" #include"check.h" template<class K, class D> class Table{ private: Rek<K,D> **root; int size; int loc; public: Table(); Table(const Table &t); Table(int sz); ~Table(); //void kill(Rek<K,D> *&rt) const Table & operator =(const Table &t); void copy(Rek<K,D> **from, Rek<K,D> **&to); Table & add(const K &k, const D & d = D()); void add(const K &k, const D &d, Rek<K,D> **&rt); D & operator [](const K &k); const D & operator [](const K &k)const; Rek<K,D> * findRek(const K &k); bool inTable(const K &k)const; template<class X, class Y> friend ostream & operator <<(ostream &out, const Table<X,Y> &t); ostream & display(ostream & out, Rek<K,D> **rt)const; }; template<class K, class D> Table<K,D>::Table(){ loc = 0; size = 0; root[loc] = new Rek<K,D>(); //line 41 } template<class K, class D> Table<K,D>::Table(const Table &t){ loc += 1; root[loc] = new Rek<K,D>(); copy(t.root,root); } template<class K, class D> Table<K,D>::Table(int sz){ // int i = 0; // for(int j = 0; j < sz; j++) // root[j] = new Rek<K,D>(); loc = 0; root[loc] = NULL; size = sz; } template<class K, class D> Table<K,D>::~Table(){ for(int i = 0; i < size; i ++) delete root[i]; } /*template<class K, class D> void Table<K,D>::kill(Rek<K,D> *&rt){ if(rt != NULL) delete rt; }*/ template<class K, class D> const Table<K,D> & Table<K,D>::operator =(const Table & t){ root = NULL; copy(t.root, root); return *this; } template<class K, class D> void Table<K,D>::copy(Rek<K,D> **from, Rek<K,D> **&to){ if(from != NULL){ to[loc] = new Rek<K,D>(from[loc]->getKey(), from[loc]->data); //for(int j = 0; j < size; j++) //to[j] = new Rek<K,D>(from[j]->getKey(), from[j]->data); check(to != NULL, "Heap overflow", __LINE__, __FILE__); } } template<class K, class D> Table<K,D> &Table<K,D>::add(const K &k, const D &d){ add(k,d,root); return *this; } template<class K, class D> void Table<K,D>::add(const K &k, const D &d, Rek<K,D> **&rt){ if(rt == NULL){ //*rt = new Rek<K,D> (k,d); rt[loc] = new Rek<K,D>(k,d); check(rt != NULL, "Heap overflow", __LINE__, __FILE__); } else check(false, "duplicate key", __LINE__, __FILE__); } template<class K, class D> D & Table<K,D>::operator[](const K &k){ if(!inTable(k)) add(k); return findRek(k)->data; } template<class K, class D> const D & Table<K,D>::operator[](const K &k)const{ check(inTable(k), "Missing key", __LINE__, __FILE__); return findRek(k)->data; } template<class K, class D> Rek<K,D> *Table<K,D>::findRek(const K &k){ Rek<K,D> **temp; temp = root; int i = 0; int j = 0; while(temp[i][j].getKey() != k && i < loc){ temp[i][j] = root[i][j]; i++; } return temp[i]; } template<class K, class D> bool Table<K,D>::inTable(const K &k)const{ Rek<K,D> **temp; temp = root; int i = 0; int j = 0; while(temp[i][j].getKey() != k && i < loc){ temp[i][j] = root[i][j]; i++; } return temp != NULL; } template<class X, class Y> ostream &operator<<(ostream &out, const Table<X,Y> &t){ return t.display(out, t.root); } template<class K, class D> ostream & Table<K,D>::display(ostream &out, Rek<K,D> **rt)const{ if(rt != NULL){ for(int j = 0; j < loc; j++) out<<rt[j]<<endl; } return out; } #endif
Code:
#ifndef REK_T #define REK_T #include<iostream> using namespace std; template <class K,class D> class Rek{ private: K key; public: D data; K getKey()const; Rek(); Rek(const K &k, const D &d = D()); template<class X, class Y> friend ostream &operator<<(ostream &out, const Rek<X,Y> &r); }; template<class X, class Y> X Rek<X,Y>::getKey()const{ return key; } template<class K, class D> Rek<K,D>::Rek(){ key = new K(); //line 32 data = new D(); //line 33 } template<class K, class D> Rek<K,D>::Rek(const K &k, const D &d):key(k),data(d){ } template<class X, class Y> ostream &operator<<(ostream &out, const Rek<X,Y> &r){ return out<<"{"<<r.key<<", "<<r.data<<"}"<<endl; } #endif
Comment