可能重复:
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 ++中)?
答案 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***
}
编译器告知t
为dependent name
,因此在typename
之前使用ptr<T*, (N - 1)>::t