Возможный дубликат:
Где и почему я должен поставить ключевые слова «template» и «typename»?
Я хочу создать шаблон, который принимает тип T и параметр N в качестве аргументов и «дает» указатель N-го уровня для T (например, если 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 ++)?
Ошибка означает, что ptr<T*, (N - 1)>::t
это зависимое имя.
Значение t
используемый в определении шаблона зависит от параметров шаблона, поэтому компилятор не может автоматически определить, что t
это тип, а не объект.
Чтобы исправить ошибку, вы должны дать компилятору подсказку, то есть сделать буквально то, что предлагает сообщение: добавьте к нему префикс typename
typedef typename ptr<T*,N-1>::t t;
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