С++ для начинающих




.Пространства имен и шаблоны функций * - часть 3


// специализация min() для массива объектов SmallInt

template<> SmallInt min<smallInt>( SmallInt* array, int size )

{

   SmallInt min_val = array[0];

   for (int i = 1; i < size; ++i)

      // при сравнении используется функция compareLess()

      if ( compareLess( array[i], min_val ) )

         min_val = array[i];

   print( "Minimum value found: " );

   print( min_val );

   return min_val;

}

Где мы должны объявить эту специализацию? Предположим, что здесь:

// ---- primer.h ----

namespace cplusplus_primer {

   // определение шаблона скрыто в пространстве имен

   template <class Type>

      Type min( Type* array, int size ) { /* ... */ }

}

// ---- user.h ----

class SmallInt { /* ... */ };

void print( const SmallInt & );

bool compareLess( const SmallInt &, const SmallInt & );

// ---- user.C ----

#include <primer.h>

#include "user.h"

// ошибка: это не специализация для cplusplus_primer::min()

template<> SmallInt min<smallInt>( SmallInt* array, int size )

   { /* ... */ }

// ...

К сожалению, этот код не работает. Явная специализация шаблона функции должна быть объявлена в том пространстве имен, где определен порождающий шаблон. Поэтому мы обязаны определить специализацию min() в пространстве cplusplus_primer. В нашей программе это можно сделать двумя способами.

Напомним, что определения пространства имен не обязательно непрерывны. Мы можем повторно открыть пространство имен cplusplus_primer для добавления специализации:

// ---- user.C ----

#include <primer.h>

#include "user.h"

namespace cplusplus_primer {

   // специализация для cplusplus_primer::min()

   template<> SmallInt min<smallInt>( SmallInt* array, int size )

   { /* ... */ }

}

SmallInt asi[4];

int main() {

   // задать значения элементов массива asi с помощью функции-члена set()

   using cplusplus_primer::min;    // using-объявление




Содержание  Назад  Вперед