частичная специализация не специализирует никакие аргументы шаблона

У меня есть следующий код, в котором я пытаюсь сделать шаблонный безопасный массив итератор.

template <typename T>
class SArrayIterator;

template <typename E>
class SArray;

class SArrayIteratorException;

template <typename T>
class SArrayIterator<T> {//<--line 16
friend std::ostream &operator <<(std::ostream &os, const SArrayIterator<T> &iter);
public:
SArrayIterator<T>(SArray<T> &sArr) : beyondLast(sArr.length()+1), current(0), sArr(sArr){}

T &operator *(){
if (current == beyondLast) throw SArrayIteratorException("Attempt to dereference 'beyondLast' iterator");
return sArr[current];
}

SArrayIterator<T> operator ++(){
if (current == beyondLast) throw SArrayIteratorException("Attempt to increment 'beyondLast' iterator");
current++;
return *this;
}

bool operator ==(const SArrayIterator<T> &other) {return sArr[current] == other.sArr[current];}
bool operator !=(const SArrayIterator<T> &other) {return !(*this == other);}
private:
int first, beyondLast, current;
SArray<T> sArr;
};

Однако, когда я компилирую, я получаю —

array.h:16: error: partial specialization ‘SArrayIterator<T>’ does not specialize any template arguments

и я не уверен, что это значит. Я предположил, что это говорит о том, что я объявляю T, но я никогда не использую его, но это явно не так.

1

Решение

Это правильный код:

template <typename T>
class SArrayIterator {

Когда ты пишешь class SArrayIterator<T> компилятор думает, что вы собираетесь специализировать шаблон, но это не так, и вы должны оставить <T> из.

Вы действительно можете оставить <T> тоже в теле класса, например:

SArrayIterator operator ++(){
3

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

Вы пишете базовый шаблон с синтаксисом частичной специализации; правильное объявление для базового шаблона:

template <typename T>
class SArrayIterator {

Специализированная декларация выглядит как

template <>
class SArrayIterator<double> {
1

По вопросам рекламы [email protected]