2012-03-02 2 views
4

Почему следующее не компилируется?Доступ к typedef для детей из шаблонизированного родителя

template <typename Child> struct Base 
{ 
    typename Child::Type t; // Does not compile. "No type named Type in Child" 
}; 

struct Derived : public Base<Derived> 
{ 
    typedef int Type; 
}; 

Как это Base не может получить доступ типа своего ребенка? Я пробовал то же самое со статической функцией, а не с typedef, и это работает отлично.

Я пробовал оба GCC 4.4.2 и clang 3.0.

+0

Возможный дубликат [статический полиморфизм C++ (CRTP) и использование typedefs из производных классов] (http://stackoverflow.com/questions/6006614/c-static-polymorphism-crtp-and-using-typedefs-from-derived -классов) – thirtythreeforty

ответ

1

Этот тип кода не будет работать, потому что Derived еще не определен еще в той точке, в которой создается база. В основном это будет неполный тип.

Альтернативы могут варьироваться от простого до очень сложного. Вероятно, самый простой способ, если вы можете это сделать, - избегать работы с Child :: Type до тех пор, пока вам это не понадобится (ленивая оценка, по существу). Это поможет, если вы точно укажете, чего вы хотите достичь.

1

В completement к stinky472 ответ, если вы base зависит от наличия типа, то вы могли бы сделать намного хуже, чем

template<typename Child, typename Type> 
struct base 
{ 
    Type t; 
}; 

    struct Derived : public Base<Derived, int> 
{ 
}; 

Это не так чист, хотя.

Смежные вопросы