PDA

View Full Version : expected type-specifier | not declared in this scope



Alain Delon
26th January 2011, 04:17
Hello,
I work on an old program, there are some errors when I compile it. In member function "void SList<T>::append(T)", errors: expected type-specifier, and errors: "P" was not declared in this scope.

template<class T>
class SList {
public:
typedef T value_type;
class Link {
public:
value_type _obj;
Link* _next;
public:
Link() { _next = 0; }
Link(const value_type v, Link* t) : _obj(v), _next(t) { }
~Link() {}
value_type obj() const { return _obj; }
Link* next() const { return _next; }
void print() const { cout << obj() << endl; }
value_type value() const { return obj(); }
friend class SList;
friend ostream& operator<< (ostream& os, const Link& t) {
os << t.obj(); return os;
}
};
class iterator {
Link* _cur;
Link* _prev;
public:
iterator(): _cur(0), _prev(0)
{
}
iterator& operator= (Link* p)
{
_cur = p;
return *this;
}
void set_prev(Link* p)
{
_prev = p;
}
Link* get_prev()
{
return _prev;
}
Link* get_cur()
{
return _cur;
}
Link* operator++()
{
assert(_cur != 0);
return _cur = _cur->_next;
}
Link* operator++(int)
{
_prev = _cur;
assert(_cur != 0 );
_cur = _cur->_next;
return _prev;
}
value_type value()
{
assert(_cur != 0 );
return _cur->value();
}
#if 1
void print() {
_cur->print();
};
#endif
int operator== (Link* p)
{
return _cur == p;
}
int operator!= (Link* p)
{
return _cur != p;
}

};


void append(const value_type data) {
Link* a = new SList<value_type>::Link;
assert( a != 0 );
a->_obj = data;
if (_nLinks != 0) {
a->_next = _last->_next;
_last = _last->_next = a;
} else
_last = a->_next = a;
_nLinks++;
}


int findItem(const value_type val) {
SList<value_type>::iterator p;
if ( _nLinks == 0 )
return 0;
p = this->begin();
do {
if ( p.value() == val )
return 1;
} while ( p++ != this->end() );
return 0;
}

Thank you for your kindly help.

mcosta
7th February 2011, 10:04
You have to use "typename" keyword.

Instead of


Link* a = new SList<value_type>::Link;
SList<value_type>::iterator p;


use


typename SList<value_type>::Link* a = new typename SList<value_type>::Link;
typename SList<value_type>::iterator p;

Alain Delon
23rd February 2011, 07:17
Thank you very much, you are right!
The program works well now.
Thanks again.