Полное руководство по шаблонам C++. Назначить оператора

В качестве примера в этой книге: 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()? Разве это не общедоступный метод?


person Vaska el gato    schedule 21.04.2016    source источник
comment
Больше подходит для english.stackexchange.com   -  person juanchopanza    schedule 21.04.2016
comment
Это означает, что разрешено использовать только открытый метод, поскольку Stack<T> и Stack<T2> являются разными типами, поэтому нельзя вызывать непубличные методы Stack<T2> в методах Stack<T>.   -  person songyuanyao    schedule 21.04.2016


Ответы (2)


Однако этот стек имеет другой тип (если вы создаете экземпляр шаблона класса для двух разных типов, вы получаете два разных типа), поэтому вы ограничены использованием общедоступного интерфейса.

Это означает, что вы должны использовать только общедоступный интерфейс. На самом деле, если вы хотите реализовать функцию operator=, вы должны использовать только общедоступный интерфейс.

Если вы не используете общедоступный интерфейс, вы не сможете получить доступ к функции top(), и это единственный способ назначить элементы стека другому стеку.

Да, top() — общедоступная функция.

person SaCh    schedule 21.04.2016
comment
Спасибо за ответ. Я был сбит с толку, потому что в переведенной книге точно сказано, что вы не можете использовать общедоступные интерфейсы, поэтому я так запутался. Также спасибо сонгюаняо - person Vaska el gato; 21.04.2016

Stack<T> и Stack<T2> являются несвязанными типами, если T != T2, поэтому метод Stack<T> не может использовать закрытые члены Stack<T2> (если только он не объявлен как friend).

Stack<T> (как и любые другие классы) ограничено использованием открытого интерфейса Stack<T2>.

person Jarod42    schedule 21.04.2016