Требования к фактическим параметрам шаблона
Шаблон функции toPower() может быть использован почти для любого типа данных. Предостережение "почти" проистекает из характера операций, выполняемых над параметром base и переменной result в теле функции toPower(). Какой бы тип мы не использовали в функции toPower(), эти операции для нее должны быть определены. В противном случае компилятор не будет знать, что ему делать. Вот список действий, выполняемых в функции toPower() с переменными base и result:
1. T result = base;
2. return (T)1;
3. return (T)0;
4. result *= base;
5. return result;
Все эти действия определены для встроенных типов. Однако если вы создадите функцию toPower() для какого-либо классового типа, то в этом случае такой класс должен будет включать общедоступные принадлежащие функции, которые обеспечивают следующие возможности:
действие 1 инициализирует объект типа Т таким образом, что класс Т должен содержать конструктор копирования,
- действия 2 и 3 преобразуют значения типа int в объект типа Т, поэтому класс Т должен содержать конструктор с параметром типа int, поскольку именно таким способом в классах реализуется преобразование к классовым типам,
- действие 4 использует операцию *= над типом Т, поэтому класс должен содержать собственную функцию-operator *=().
- действие 5 предполагает, что в типе T предусмотрена возможность построения безопасной копии возвращаемого объекта (см. конструктор копирования).
Схема такого класса выглядит следующим образом:
class T
{
public:
T (const T &base); // конструктор копирования
T (int i); //приведение int к Т
operator *= (T base);
// ... прочие методы
}
Используя классы в шаблонах функций, убедитесь в том, что вы знаете, какие действия с ними выполняются в шаблоне функции, и определены ли для класса эти действия. Если вы не снабдили класс необходимыми функциями, возникнут различные невразумительные сообщения об ошибках.