«ожидаемый инициализатор перед» & lt; » Маркер & Quot; попытка специализации члена шаблона

Я пытаюсь определить элемент шаблона внутри класса шаблона.

Вот фрагмент заголовочного файла:

template <typename Type>
class Queue
{
private:
// class scope definitions
// Node is a nested structure definition local to this class
struct Node {Type item; struct Node* next;};
enum {Q_SIZE = 10};
template <typename Type2> class DeepCopy // template member
{
public:
void docopy(Type2& d, const Type2& s);
};
...

Итак, элемент шаблона определен, но я хочу сделать явную специализацию для метода docopy, чтобы он глубже копировал, когда тип является указателем. Я помещу другой фрагмент из заголовочного файла с шаблоном метода и специализацией:

// template member
template <typename Type>
template <typename Type2>
void Queue<Type>::DeepCopy<Type2>::docopy(Type2& d, const Type2& s)
{
d = s;
}

// template member specialization for pointers
template <typename Type>
template <typename Type2>
void Queue<Type*>::DeepCopy<Type2*>::docopy(Type2* d, const Type2* s)
{
if (s)
d = new (*s);
else
d = 0;
}

Компилятор отправляет мне следующую ошибку: ожидаемый инициализатор до ‘<знак

Я не могу понять, что я делаю не так. Любая помощь?

3

Решение

Вы должны написать свою DeepCopy вне очереди в качестве шаблона верхнего уровня. Используйте только внутри своей очереди.

   template <typename T>
class Queue {
DeepCopy<T> myCopy;
....
myCopy.doCopy(n.item, newItem);
2

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

Для вашего примера вы должны

  1. Частичная специализация Queue класс для T*,
  2. В частичной специализации Queue<T*> написать определение структуры DeepCopy,
  3. Написать специализацию Queue<T*>::DeepCopy за U*,
  4. Функция записи Queue<T*>::DeepCopy<U*>::docopy,
2