#c #class-template
Вопрос:
в чем разница между следующими двумя фрагментами?
- с
<T>
для оператора <
template<typename T>
class Stack {
...
friend std::ostreamamp; operator<< <T> (std::ostreamamp;,
Stack<T> constamp;);
};
- без
<T>
template<typename T>
class Stack {
...
friend std::ostreamamp; operator<< (std::ostreamamp;,
Stack<T> constamp;);
};
Ответ №1:
В #1 компилятор будет искать шаблон функции, называемый operator<<
таковым, который operator<< <T>
имеет точную заданную сигнатуру, и класс Stack<T>
будет поддерживать только эту конкретную специализацию.
В #2 компилятор будет искать вызванную функцию, не являющуюся шаблоном operator<<
, которая имеет точную заданную подпись. Если такая функция будет найдена, Stack<T>
подружитесь с ней. Если такая функция не найдена, функция тем самым объявляется (но это проблематичная ситуация, поскольку нет способа ее общего определения).
Комментарии:
1. В #1, если U используется вместо T в
Stack<U>
т. Е.,friend std::ostreamamp; operator<< <T> (std::ostreamamp;, Stack<U> constamp;);
, это то же самое, что и до этого изменения?2. @Willi Там должна быть декларация
U
, чтобы понять это. Это еще один параметр шаблона? В любом случае, вам следует задать новый вопрос об этом сценарии. Комментарии следует использовать только для того, чтобы запросить разъяснения по поводу ответа на исходный вопрос. Раздел комментариев на самом деле не подходит для написания более 1 строки кода.3. ты прав. Там должен быть еще один параметр шаблона. Я понял. Спасибо!