Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Template inheritance inner class access problem

I can't believe gcc won't accept the following code... Please tell me if accessing an inner class from a base template is really not possible or am i missing something?

template <class T> class BaseClass
{
public:
    struct MyStruct
    {
        T *data;
    };
};

template <class T> class ChildClass : public BaseClass <T>
{
    public:

    void problem()
    {
        MyStruct ms1; //error: 'MyStruct' was not declared in this scope
        ::MyStruct ms2; //error: '::MyStruct' has not been declared
        BaseClass<T>::MyStruct ms3; //error: expected `;' before 'ms3'
    }
};
like image 454
Ryan Avatar asked May 16 '11 06:05

Ryan


2 Answers

The problem is that MyStruct is a dependent name, so you have to tell the compiler to defer name lookup until the template is instantiated by qualifying it with the base class name:

typename BaseClass<T>::MyStruct ms1;

For more information, I'd read the Parashift C++ FAQ entry, "Why am I getting errors when my template-derived-class uses a nested type it inherits from its template-base-class?"

like image 133
James McNellis Avatar answered Oct 02 '22 23:10

James McNellis


BaseClass<T>::MyStruct ms3;

Should be

typename BaseClass<T>::MyStruct ms3;

Since the MyStruct is a dependent name, i.e., it depends on the template argument.
Relevant: Where and why do I have to put “template” and “typename” on dependent names?

like image 38
Xeo Avatar answered Oct 02 '22 23:10

Xeo