Невозможно привести подкласс Template к другому экземпляру Template. - PullRequest
0 голосов
/ 11 января 2020

предположим, что у нас есть шаблон stack<class T, int maxElements с подклассом Entry, который создаст связанный список для стека, поэтому что-то вроде этого:

template <class T, int maxElements>
class Stack{
private: 
     class Entry{
        friend class Stack;
        T info;
        Entry* next;
     };
     Entry* first;
public:
    template<class U, int n>
    void append(const Stack<U, n>& s){
          if(isEmpty()) first = s.first; /* here is the problem*/
          ....
    }

};

Итак, проблема в строке помечены, и это assigning to 'Stack<char, 100>::Entry *' from incompatible type 'Stack<char, 10>::Entry *const', и это потому, что он строит «запись класса» для каждого экземпляра шаблона, но дело в том, что запись не зависит от параметра maxElement, поэтому я хотел бы знать, есть ли способ сообщить об этом компилятору.
Пока что единственный способ, которым я могу думать, который может это сделать, - это извлечь класс из шаблона и сделать себя шаблоном, основанным только на T

PS: я знаю, что делю память в строке, где у меня ошибка, одна вещь за раз

1 Ответ

2 голосов
/ 11 января 2020

Проблема в том, что разные экземпляры шаблонов имеют разные типы. При этом вложенные типы (в данном случае Entry) также являются разными типами.

Решение так же просто: переместить детали в (частный) базовый класс, который зависит только от типа:

template<typename T>
class StackBase {
protected:
    struct Entry {
        T info;
        Entry* next;
    };
};

Тогда вы наследуете от этого базового класса:

template<typename T, int maxElements>
class Stack: private StackBase<T> {
    ...
};
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...