Рекурсивный шаблон для генерации указателя

Возможный дубликат:
Где и почему я должен поставить ключевые слова «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 ++)?

2

Решение

Ошибка означает, что ptr<T*, (N - 1)>::t это зависимое имя.

Значение t используемый в определении шаблона зависит от параметров шаблона, поэтому компилятор не может автоматически определить, что t это тип, а не объект.

Чтобы исправить ошибку, вы должны дать компилятору подсказку, то есть сделать буквально то, что предлагает сообщение: добавьте к нему префикс typename

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

Другие решения

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

1

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector