C++ typedef 和模板语法?

C++ typedef and templates syntax?

我正在阅读这篇关于可变参数模板的 tutorial,但在下面的代码中:

 template<int index, class C>
struct container_index {

  // points to the "next" container type 
  typedef typename container_index<
    index-1,
    typename C::base_container
  >::container_type container_type;

  // points to the next T-type 
  typedef typename container_index<
    index-1,
    typename C::base_container
  >::type type;
};

这些 typedef 似乎是多余的,但它编译得很好。问题只是我不明白为什么他们会这样,而且我没有找到解释这种情况的教程。有人可以解释一下吗?为什么重复 typedef 名称:

"::container_type container_type;"

 "::type type;"

不可能是这样的:

typedef typename container_index<
        index-1,
        typename C::base_container
      >  type;

非常感谢。

typedef 为类型命名。所以你需要提供你想要给它的类型和名称。

typedef typename container_index<index-1, typename C::base_container>::type type;

typename container_index<index-1, typename C::base_container>::type 是我们描述我们想要命名的类型,分号前的最后一个 type 是我们想要给它起的名字。

比较:

struct Example
{
    typedef Fruit::orange citrus; // declare a type called Example::citrus, which is the same type as Fruit::orange
    typedef Fruit::apple apple; // declare a type called Example::apple, which is the same type as Fruit::apple - the same operation as the line above, and so the same syntax!
};

该示例演示了模板中的递归类型定义。关键是递归基本情况被指定为 index=0:

的特化
template<class C>
struct container_index<0, C> {

    // point to C instead of C::base_container
    typedef C container_type;

    // point to C::type instead of C::base_container::type
    typedef typename C::type type;
};

正是这个基本情况使得类型推导成为可能。因此,例如,类型 container_index<2, MyCont>::container_type 扩展为 container_index<1, MyCont>::container_type,后者又扩展为 container_index<0, MyCont>::container_type,最终扩展为 MyCont。