用于指针生成的递归模板

时间:2012-09-04 12:05:45

标签: c++ templates pointers

  

可能重复:
  Where and why do I have to put the “template” and “typename” keywords?

我想创建一个模板,它将类型T和参数N作为参数,并且'给'指示T的N年级(例如,如果T是int而N是2它应该给int**

到目前为止我的代码是:

template<class T,int N>
struct ptr
{
  typedef ptr<T*,N-1>::t t;
};

template<class T>
struct ptr<T,0>
{
  typedef T t;
};

int main()
{
  ptr<int,3>::t a; //a should be int***
}

但它给了我这个编译错误:

source.cpp:6:11: error: need 'typename' before 'ptr<T*, (N - 1)>::t' because 'ptr<T*, (N - 1)>' is a dependent scope

这意味着什么以及如何解决(如果可能在C ++中)?

2 个答案:

答案 0 :(得分:3)

错误表示ptr<T*, (N - 1)>::t依赖名称

模板定义中使用的t的含义取决于模板参数,因此编译器无法自动确定t是类型而不是对象。

要纠正错误,您必须给编译器一个提示,即按字面意思执行消息的建议:用typename作为前缀

typedef typename ptr<T*,N-1>::t t;

答案 1 :(得分:1)

template<class T,int N>
struct ptr
{
  typedef typename ptr<T*,N-1>::t t;
};

template<class T>
struct ptr<T,0>
{
  typedef T t;
};

int main()
{
  ptr<int,3>::t a; //a should be int***
}

编译器告知tdependent name,因此在typename之前使用ptr<T*, (N - 1)>::t