В качестве примера в этой книге: https://rads.stackoverflow.com/amzn/click/com/0201734842 у них есть этот класс:
template <typename T>
class Stack {
private:
std::deque<T> elems; // elements
public:
void push(T const&); // push element
void pop(); // pop element
T top() const; // return top element
bool empty() const { // return whether the stack is empty
return elems.empty();
}
// assign stack of elements of type T2
template <typename T2>
Stack<T>& operator= (Stack<T2> const&);
};
А вот реализация оператора присваивания:
template <typename T>
template <typename T2>
Stack<T>& Stack<T>::operator= (Stack<T2> const& op2)
{
if ((void*)this == (void*)&op2) { // assignment to itself?
return *this;
}
Stack<T2> tmp(op2); // create a copy of the assigned stack
elems.clear(); // remove existing elements
while (!tmp.empty()) { // copy all elements
elems.push_front(tmp.top());
tmp.pop();
}
return *this;
}
И вот некоторое объяснение того, что делает этот метод:
Внутри функции-члена вы можете просто получить доступ ко всем необходимым данным для назначенного стека op2. Однако этот стек имеет другой тип (если вы создаете экземпляр шаблона класса для двух разных типов, вы получаете два разных типа), поэтому вы ограничены использованием общедоступного интерфейса. Из этого следует, что единственный способ получить доступ к элементам — это вызвать функцию top(). Однако тогда каждый элемент должен стать верхним элементом. Таким образом, сначала необходимо создать копию op2, чтобы элементы брались из этой копии с помощью вызова pop().
Я путаюсь с этой частью:
Однако этот стек имеет другой тип (если вы создаете экземпляр шаблона класса для двух разных типов, вы получаете два разных типа), поэтому вы ограничены использованием общедоступного интерфейса.
Говорит ли это, что мне разрешено ТОЛЬКО использовать общедоступные интерфейсы, или мне НЕ разрешено использовать общедоступные интерфейсы? Если это означает, что мне не разрешено использовать общедоступные интерфейсы, то что такое функция-член top()? Разве это не общедоступный метод?
Stack<T>
иStack<T2>
являются разными типами, поэтому нельзя вызывать непубличные методыStack<T2>
в методахStack<T>
. - person songyuanyao   schedule 21.04.2016