Template inheritance inner class access problem

2019-04-05 19:18发布

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

2条回答
对你真心纯属浪费
2楼-- · 2019-04-05 19:46
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?

查看更多
走好不送
3楼-- · 2019-04-05 19:51

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?"

查看更多
登录 后发表回答