Доступ к дочернему typedef от шаблонного родителя - PullRequest
4 голосов
/ 03 марта 2012

Почему следующее не компилируется?

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 не может получить доступ к типу Child?Я попробовал то же самое со статической функцией вместо typedef, и это прекрасно работает.

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

Ответы [ 2 ]

1 голос
/ 03 марта 2012

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

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

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

Хотя это не так чисто.

1 голос
/ 03 марта 2012

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

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

...