Используйте ключевое слово typename только в объявлениях и определениях шаблонов, если у вас есть полное имя, которое относится к типу и зависит от параметра шаблона.

лонах, где и почему я должен поставитьtypename а такжеtemplate на зависимых именах? Что именно являются зависимыми именами в любом случае? У меня есть следующий код:

template <typename T, typename Tail> // Tail will be a UnionNode too.
struct UnionNode : public Tail {
    // ...
    template<typename U> struct inUnion {
        // Q: where to add typename/template here?
        typedef Tail::inUnion<U> dummy; 
    };
    template< > struct inUnion<T> {
    };
};
template <typename T> // For the last node Tn.
struct UnionNode<T, void> {
    // ...
    template<typename U> struct inUnion {
        char fail[ -2 + (sizeof(U)%2) ]; // Cannot be instantiated for any U
    };
    template< > struct inUnion<T> {
    };
};

У меня проблема вtypedef Tail::inUnion<U> dummy линия. Я уверен, чтоinUnion является зависимым именем, и VC ++ вполне прав, подавляя его. Я также знаю, что я должен быть в состоянии добавитьtemplate где-то сказать компилятору, что inUnion - это идентификатор шаблона. Но где именно? И тогда следует предположить, что inUnion является шаблоном класса, т.е.inUnion<U> называет тип, а не функцию?

Ответы на вопрос(1)

Ваш ответ на вопрос