путать с шаблоном класса в C ++ - PullRequest
2 голосов
/ 08 ноября 2011

Я знаю, что определения классов шаблонов похожи на:

template <class TYPE>
class cars{
   public:
   TYPE myCar;
}

, но где-то я сталкивался с этим фрагментом кода:

template <class T>
class polynomialT {

    ...

}
************************************** 
class GFNUM2m {

...
}
**************************************
template class polynomialT<GFNUM2m>;

последняя строка для меня неопределенная?Кто-нибудь знает, что случилось?это объект класса polynomialT? (кажется, не потому, что у него нет имени) это шаблон? (кажется, дубликат, потому что он был один раз шаблонизирован)

Ответы [ 5 ]

5 голосов
/ 08 ноября 2011
template class polynomialT<GFNUM2m>;

Это запрос на явное создание экземпляра класса шаблона polynomialT с GFNUM2m, включая создание экземпляров всех его не шаблонных функций.

Некоторые случаи, когда это необходимо:1007 *

Когда вы хотите избежать создания нескольких шаблонов (которые затем очищаются компоновщиком); Когда вы хотите убедиться, что полный шаблон может быть создан даже для тех (не шаблон)не вызванные функции; Если вы хотите предоставить определения шаблонов в файле .cpp;
1 голос
/ 08 ноября 2011

последняя строка эквивалентна:

class polynomialT {
  protected:
  GFNUM2m *coeff;                   // array of coefficients (? see below)
  int degree;
  ...

}

GFNUM2m *coeff не является массивом, это просто указатель на переменную GFNUM2m.Массив и указатель связаны каким-либо образом, например, вы можете динамически выделить массив с помощью coeff = new GFNUM2m[10], но это не рекомендуется.

0 голосов
/ 08 ноября 2011

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

Специализации шаблона кажутся похожими, но требуют template<>, чтобы объявить о специализации уже объявленного шаблона. Кроме того, они будут определять альтернативное определение класса для этого конкретного параметра шаблона (как упоминает @rerun).

Теперь, на пересечении тех, вы могли видеть

template<> class polynomialT<GFNUM2m>;

Который IS , фактически, заявленный форвард шаблон специализация . Это послужило бы для предотвращения того, что компилятор автоматически создает экземпляр шаблона класса для этого параметра типа в течение остальной части модуля перевода.

0 голосов
/ 08 ноября 2011

Последняя строка является предварительным объявлением шаблона класса polynomialT с параметром шаблона GFNUM2m, который также создает экземпляр класса шаблона.

0 голосов
/ 08 ноября 2011

это означает, что шаблон в классе polynomialT теперь является классом GFNUM2m.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...