=?windows-1252?Q?Re=3A_What_does_=22ISO_C=2B=2B_forbids_declaration_of_=91It e?= =?windows-1252?Q?rator'_with_no_type=22_mean?=
On Oct 25, 4:18 pm, davidpryce...@yahoo.com.au wrote:
Hi List,
I am trying to learn about Design Patterns from GoF book. I am
relatively new to C++ and I cannot understand the following error I am
receiving when compiling (g++ -c comp.cpp) the composite design
pattern example.
comp.cpp:15: error: ISO C++ forbids declaration of 'Iterator' with no
type
comp.cpp:15: error: 'Iterator' declared as a 'virtual' field
comp.cpp:15: error: expected ';' before '<' token
Line 15 is
virtual Iterator <Equipment*>* CreateIterator();
What is the meaning of this error? What do I need to do to over come
this error.
Thanks
David
#include <iostream>
#include <list>
using namespace std;
class Equipment {
public:
virtual ~Equipment();
const char* Name() {
return _name;
}
virtual void Add(Equipment*);
virtual void Remove(Equipment*);
virtual Iterator <Equipment*>* CreateIterator();
protected:
Equipment(const char*);
private:
const char* _name;
};
Its telling you that Iterator is not a type, or more specifically,
that Iterator< Equipment* > is not a known type.
Since you are studying composite design pattern, and since Equipment
seems to be a composite made of components (plus i see include <list>
above), shouldn't Equipment have a std::list member?
In which case Equipment's iterator should use the underlying
container's iterator.
Something like:
#include <iostream>
#include <list>
class Component
{
const std::string m_s;
protected:
Component(const std::string s) : m_s(s) { }
public:
virtual ~Component() { }
std::string const& name() const
{
return m_s;
}
};
class Tool : public Component
{
public:
Tool(const std::string& s) : Component(s) { }
};
template < typename E >
class Equipment
{
std::list< E > le;
public:
void push_back(const E& e)
{
le.push_back( e );
}
void pop_back(const E& e)
{
le.pop_back( e );
}
// iteration
typedef typename std::list< E >::iterator iterator;
iterator begin() { return le.begin(); }
iterator end() { return le.end(); }
typedef typename std::list< E >::const_iterator const_iterator;
const_iterator begin() const { return le.begin(); }
const_iterator end() const { return le.end(); }
};
int main()
{
Equipment< Component > equip;
Tool hammer("hammer");
equip.push_back( hammer );
equip.push_back( Tool("ladder") );
equip.push_back( Tool("flashlight") );
typedef Equipment< Component >::const_iterator CIter;
for(CIter it = equip.begin(); it != equip.end(); ++it)
{
std::cout << (*it).name() << std::endl;
}
}
/*
hammer
ladder
flashlight
*/
--
[ See http://www.gotw.ca/resources/clcm.htm for info about ]
[ comp.lang.c++.moderated. First time posters: Do this! ]