简体   繁体   中英

Can't use struct in derived templated class?

Ok, maybe not the best title, but here's the deal:

I have a templated interface:

template<typename T>
class MyInterface
{
public:
    struct MyStruct 
    {
        T value;
    };

    virtual void doThis(MyStruct* aPtr) = 0;
};

and an implementation:

template <typename T>
class MyImpl : public MyInterface<T>
{
public:
    void doThis(MyStruct* aPtr)
    {
    } // doThis
};

However, the compiler complains:

In file included from MyTest.cpp:3:0:
MyImpl.h:7:17: error: ‘MyStruct’ has not been declared
     void doThis(MyStruct* aPtr)

Why is that?

The following compiled for me:

template<typename T>
class MyInterface
{
public:
    struct MyStruct
    {
        T value;
    };

    virtual void doThis(MyStruct* aPtr) = 0;
};

template <typename T>
class MyImpl : public MyInterface<T>
{
public:
    void doThis(typename MyInterface<T>::MyStruct* aPtr)
    {
    }
};


int main() {
  MyImpl<int> t;

}

The main change is that you need to qualify that the MyStruct was defined within MyInterface<T> .

Since the compiler cannot determine what kind of identifier is the templated subtype, you must help it using the typename keyword. (See When is the "typename" keyword necessary? for more details on typename)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM