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

Discussion in 'C++' started by Generic Usenet Account, Jul 14, 2005.

  1. 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;

    }
     
    Generic Usenet Account, Jul 14, 2005
    #1
    1. Advertising

  2. Re: Templates: "implicit typename is deprecated" error and typedef'ingtemplates

    Generic Usenet Account wrote:
    > This is a two-part question.


    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.

    > (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? [..]


    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.

    > (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>;


    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?

    >
    > Thanks,
    > Gus
    >
    > [..]


    V
     
    Victor Bazarov, Jul 14, 2005
    #2
    1. Advertising

  3. Generic Usenet Account wrote:
    > 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


    add 'typename' in the line of the error message. For details see:
    http://womble.decadentplace.org.uk/c /template-faq.html

    > 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;


    What is DSRegistry? If It's a template you cannot typedef it like that.

    > typedef DSRegistry<class T> SingletonRegistry<class T>;
    > typedef template DSRegistry<class T> template SingletonRegistry<class
    > T>;
    > typedef DSRegistry<class T> template SingletonRegistry<class T>;


    You seem to be confused about templates and typedefs. They work
    differently!
     
    Mr. Blackwell, Jul 14, 2005
    #3
  4. Mr. Blackwell wrote:
    > > typedef DSRegistry SingletonRegistry;

    >
    > What is DSRegistry? If It's a template you cannot typedef it like that.
    >
    > > typedef DSRegistry<class T> SingletonRegistry<class T>;
    > > typedef template DSRegistry<class T> template SingletonRegistry<class
    > > T>;
    > > typedef DSRegistry<class T> template SingletonRegistry<class T>;

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


    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("Second" , &i2);
    SingletonRegistry<int>::instance().addEntry("Third" , &i3);

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

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

    }

    -Gus
     
    Generic Usenet Account, Jul 14, 2005
    #4
    1. Advertising

Want to reply to this thread or ask your own question?

It takes just 2 minutes to sign up (and it's free!). Just click the sign up button to choose a username and then you can ask your own questions on the forum.
Similar Threads
  1. James Aguilar

    Typedef-ing an iterator

    James Aguilar, Dec 12, 2004, in forum: C++
    Replies:
    1
    Views:
    374
    Rob Williscroft
    Dec 12, 2004
  2. James Aguilar

    typedef'ing Function Pointers

    James Aguilar, Mar 27, 2005, in forum: C++
    Replies:
    3
    Views:
    472
    Ioannis Vranos
    Mar 27, 2005
  3. Enrico Porreca

    Typedef'ing a function

    Enrico Porreca, Jun 4, 2005, in forum: C Programming
    Replies:
    2
    Views:
    421
    Malcolm
    Jun 5, 2005
  4. Enrico Porreca

    Typedef'ing a function

    Enrico Porreca, Jun 4, 2005, in forum: C Programming
    Replies:
    0
    Views:
    328
    Enrico Porreca
    Jun 4, 2005
  5. Enrico Porreca

    Typedef'ing a function

    Enrico Porreca, Jun 4, 2005, in forum: C Programming
    Replies:
    0
    Views:
    361
    Enrico Porreca
    Jun 4, 2005
Loading...

Share This Page