G
Generic Usenet Account
This is a two-part question.
(1) I have implemented a "Datastructure Registry" template class. I am
getting no compiler warnings with older compilers, but newer compilers
are generating the following error messages:
warning: implicit typename is deprecated,
please see the documentation for details
Can someone kindly suggest how to get rid of these warnings? The
source code follows.
(2) I want to use the "Datastructure Registry" template class to
implement a "Registry of Singletons", as mentioned in the GoF Design
patterns book. For this I want to do something like this:
typedefine the "Datastructure Registry" template-class as the "Registry
of Singletons" template-class.
I have tried various things, but nothing seems to be working.
typedef DSRegistry SingletonRegistry;
typedef DSRegistry<class T> SingletonRegistry<class T>;
typedef template DSRegistry<class T> template SingletonRegistry<class
T>;
typedef DSRegistry<class T> template SingletonRegistry<class T>;
Thanks,
Gus
//////////////////////////////////////////////////
#ifndef _DSREGISTRY_H_
#define _DSREGISTRY_H_
#include <iostream>
#include <string>
#include <map>
using namespace std;
template <class T>
class DSRegistry
{
public:
virtual ~DSRegistry(){};
static DSRegistry& instance()
{
if(_instance == NULL)
_instance = new DSRegistry();
return *_instance;
};
bool addEntry(string name, T* ptr)
{
bool retVal = false;
if(_map.find(name) == _map.end())
{
pair<string, T*> newEntry;
newEntry.first = name;
newEntry.second = ptr;
retVal = _map.insert(newEntry).second;
}
if(retVal == false)
{
#ifdef DEBUG
cerr << "Datastructure with name " << name
<< " previously registered --- request rejected" << endl;
#endif
}
return retVal;
}
bool deleteEntry(string name)
{
bool retVal = false;
map<string, T*>::iterator itor = _map.find(name);
if(itor != _map.end())
{
_map.erase(itor);
retVal = true;
}
if(retVal == false)
{
#ifdef DEBUG
cerr << "Datastructure with name " << name
<< " not found --- request rejected" << endl;
#endif
}
return retVal;
}
T* operator()(const string name)
{
T* retVal = NULL;
map<string, T*>::iterator itor = _map.find(name);
if(itor != _map.end())
{
retVal = itor->second;
}
if(retVal == NULL)
{
#ifdef DEBUG
cerr << "Cannot map datastructure with name " << name
<< " --- request rejected" << endl;
#endif
}
return retVal;
}
protected:
DSRegistry(){};
static DSRegistry* _instance;
map<string, T*> _map;
};
#endif //_DSREGISTRY_H_
//////////////////////////////////////////////////
#include <iostream>
#include "DSRegistry.h"
using namespace std;
DSRegistry<int>* DSRegistry<int>::_instance = NULL;
main()
{
int i1 = 1, i2 = 2, i3 = 3;
DSRegistry<int>::instance().addEntry("First" ,&i1);
DSRegistry<int>::instance().addEntry("Second" , &i2);
DSRegistry<int>::instance().addEntry("Third" , &i3);
int *val = DSRegistry<int>::instance()("Third");
if(val)
cout << "Returned value " << *val << endl;
}
(1) I have implemented a "Datastructure Registry" template class. I am
getting no compiler warnings with older compilers, but newer compilers
are generating the following error messages:
warning: implicit typename is deprecated,
please see the documentation for details
Can someone kindly suggest how to get rid of these warnings? The
source code follows.
(2) I want to use the "Datastructure Registry" template class to
implement a "Registry of Singletons", as mentioned in the GoF Design
patterns book. For this I want to do something like this:
typedefine the "Datastructure Registry" template-class as the "Registry
of Singletons" template-class.
I have tried various things, but nothing seems to be working.
typedef DSRegistry SingletonRegistry;
typedef DSRegistry<class T> SingletonRegistry<class T>;
typedef template DSRegistry<class T> template SingletonRegistry<class
T>;
typedef DSRegistry<class T> template SingletonRegistry<class T>;
Thanks,
Gus
//////////////////////////////////////////////////
#ifndef _DSREGISTRY_H_
#define _DSREGISTRY_H_
#include <iostream>
#include <string>
#include <map>
using namespace std;
template <class T>
class DSRegistry
{
public:
virtual ~DSRegistry(){};
static DSRegistry& instance()
{
if(_instance == NULL)
_instance = new DSRegistry();
return *_instance;
};
bool addEntry(string name, T* ptr)
{
bool retVal = false;
if(_map.find(name) == _map.end())
{
pair<string, T*> newEntry;
newEntry.first = name;
newEntry.second = ptr;
retVal = _map.insert(newEntry).second;
}
if(retVal == false)
{
#ifdef DEBUG
cerr << "Datastructure with name " << name
<< " previously registered --- request rejected" << endl;
#endif
}
return retVal;
}
bool deleteEntry(string name)
{
bool retVal = false;
map<string, T*>::iterator itor = _map.find(name);
if(itor != _map.end())
{
_map.erase(itor);
retVal = true;
}
if(retVal == false)
{
#ifdef DEBUG
cerr << "Datastructure with name " << name
<< " not found --- request rejected" << endl;
#endif
}
return retVal;
}
T* operator()(const string name)
{
T* retVal = NULL;
map<string, T*>::iterator itor = _map.find(name);
if(itor != _map.end())
{
retVal = itor->second;
}
if(retVal == NULL)
{
#ifdef DEBUG
cerr << "Cannot map datastructure with name " << name
<< " --- request rejected" << endl;
#endif
}
return retVal;
}
protected:
DSRegistry(){};
static DSRegistry* _instance;
map<string, T*> _map;
};
#endif //_DSREGISTRY_H_
//////////////////////////////////////////////////
#include <iostream>
#include "DSRegistry.h"
using namespace std;
DSRegistry<int>* DSRegistry<int>::_instance = NULL;
main()
{
int i1 = 1, i2 = 2, i3 = 3;
DSRegistry<int>::instance().addEntry("First" ,&i1);
DSRegistry<int>::instance().addEntry("Second" , &i2);
DSRegistry<int>::instance().addEntry("Third" , &i3);
int *val = DSRegistry<int>::instance()("Third");
if(val)
cout << "Returned value " << *val << endl;
}