2015-04-24 4 views
2

Хорошо, может быть, не самое лучшее название, но вот в чем дело:Нельзя использовать struct в производном шаблоном классе?

У меня есть шаблонный интерфейс:

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(MyStruct* aPtr) 
    { 
    } // doThis 
}; 

Однако компилятор жалуется:

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

Почему?

+0

Используйте 'typename MyInterface :: MyStruct'. – BoBTFish

ответ

3

Ниже скомпилирован для меня:

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; 

} 

Основное изменение заключается в том что вам нужно квалифицировать, что MyStruct был определен в MyInterface<T>.

Поскольку компилятор не может определить, каким идентификатором является шаблонный подтип, вы должны помочь ему, используя ключевое слово typename. (См. When is the "typename" keyword necessary? для получения дополнительной информации о typename)

+0

Woohooo! В самом деле. Спасибо @jsantander. – Egholm