Я удивлен, что вы получаете указанную вами ошибку, потому что у вас есть очень очевидная синтаксическая ошибка в конструкторе в элементе данных:
Stack() : T[N]{} {}; // T[N] isn't valid!
T[N]; // same!
Если T = int
, приведенное выше будет преобразовано в int[4]
что приводит к ошибке. Вероятно, вы хотите:
Stack() : arr{} {}
T arr[N];
Предполагая, что это исправлено, мы наконец переходим к ошибке:
Missing 'typename' prior to dependent type name 'Stack<T, N>::iterator'
Это означает, что iterator
- это тип, а вы не может напрямую получить к нему доступ с помощью оператора ::
. Вы должны написать typename
перед Stack<T, N>::iterator
, чтобы компилятор знал, что вы хотите получить доступ к подтипу внутри Stack
. Прочтите ответ. Где и почему мне нужно поместить ключевые слова «template» и «typename»? для более подробной информации.
Чтобы исправить это, измените функцию на:
template<class T, int N>
typename Stack<T, N>::iterator Stack<T, N>::insert(typename Stack::iterator p, const T &v)
//^^typename here ^^ and here
{
...
}
Как вы, наверное, догадались, набирать столько текста - это довольно хакти c. Поэтому было введено ключевое слово auto
, чтобы программист не набирал его каждый раз, когда он хочет его использовать:
Stack<int,4>::iterator i = s.insert(it, 3); // imagine typing this everytime
//use auto
auto it = s.insert(iterator, 3); //good