Connecting Tech Pros Worldwide Help | Site Map

Templates: "implicit typename is deprecated" error and typedef'ing templates

Generic Usenet Account
Guest
 
Posts: n/a
#1: Jul 23 '05
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;

}

Victor Bazarov
Guest
 
Posts: n/a
#2: Jul 23 '05

re: Templates: "implicit typename is deprecated" error and typedef'ing templates


Generic Usenet Account wrote:[color=blue]
> This is a two-part question.[/color]

Is it? Or is it simply a message with more than one question?

BTW, why did you cross-post to 'comp.sources.d'? I don't post there, I
don't know their rules, so, sorry, I am not cross-posting my reply.
[color=blue]
> (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? [..][/color]

Make sure to add 'typename' where your compiler suggests. Next time you
post about a compiler error message or a warning, indicate in the source
code _where_ the warning is emitted, _what_line_ it is related to.
[color=blue]
> (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>;[/color]

None of those are going to work. There is not "template typedefs" in C++
(yet). To create a typedef (a synonym to a type), you need _a_type_, not
a _template_. In any case, the registry needs to be a singleton itself,
probably. And if it will work with all other singletons in a certain way,
shouldn't they all be of the same [base] class then?
[color=blue]
>
> Thanks,
> Gus
>
> [..][/color]

V
Mr. Blackwell
Guest
 
Posts: n/a
#3: Jul 23 '05

re: Templates: "implicit typename is deprecated" error and typedef'ing templates


Generic Usenet Account wrote:[color=blue]
> 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[/color]

add 'typename' in the line of the error message. For details see:
http://womble.decadentplace.org.uk/c...plate-faq.html
[color=blue]
> 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;[/color]

What is DSRegistry? If It's a template you cannot typedef it like that.
[color=blue]
> typedef DSRegistry<class T> SingletonRegistry<class T>;
> typedef template DSRegistry<class T> template SingletonRegistry<class
> T>;
> typedef DSRegistry<class T> template SingletonRegistry<class T>;[/color]

You seem to be confused about templates and typedefs. They work
differently!

Generic Usenet Account
Guest
 
Posts: n/a
#4: Jul 23 '05

re: Templates: "implicit typename is deprecated" error and typedef'ing templates


Mr. Blackwell wrote:[color=blue][color=green]
> > typedef DSRegistry SingletonRegistry;[/color]
>
> What is DSRegistry? If It's a template you cannot typedef it like that.
>[color=green]
> > typedef DSRegistry<class T> SingletonRegistry<class T>;
> > typedef template DSRegistry<class T> template SingletonRegistry<class
> > T>;
> > typedef DSRegistry<class T> template SingletonRegistry<class T>;[/color]
>
> You seem to be confused about templates and typedefs. They work
> differently![/color]

Thanks for the clarification. After you mentioned about the
restriction on templates, I was able to get it working with
inheritance. Also, your suggestion of sticking in the "typename"
keyword worked.

///////////////////////////////////////////////
#ifndef _SINGLETONREGISTRY_H_
#define _SINGLETONREGISTRY_H_

#include "DSRegistry.h"

template <class T>
class SingletonRegistry : public DSRegistry<T>
{
};

#endif //_SINGLETONREGISTRY_H_


///////////////////////////////////////////////
#include <iostream>

#include "SingletonRegistry.h"

using namespace std;

DSRegistry<int>* DSRegistry<int>::_instance = NULL;

main()
{
int i1 = 1, i2 = 2, i3 = 3;

SingletonRegistry<int>::instance().addEntry("First " ,&i1);
SingletonRegistry<int>::instance().addEntry("Secon d" , &i2);
SingletonRegistry<int>::instance().addEntry("Third " , &i3);

int *val = SingletonRegistry<int>::instance()("Third");

if(val)
cout << "Returned value " << *val << endl;

}

-Gus

Closed Thread