Информация об изменениях

Сообщение Не могу явно инстанцировать шаблон функции-члена от 09.10.2018 18:03

Изменено 09.10.2018 18:09 Евгений Музыченко

Не могу явно инстанцировать шаблон функции-члена
Хочу в классе иметь несколько вариантов одной и той же мелкой вычислительной (а потому инлайновой) функции. Создаю шаблон:

  template <typename ArgType, typename ResType>
  ResType func (ArgType arg) { return ResType (Arg * i);   }


Затем прямо в определении класса пытаюсь его инстанцировать:

  template short func <short, short> (short);


На что MS VC++ версий от 13.10 до 15.00 выдает "error C2252: cannot explicitly instantiate template in current scope". В 19.10 сообщение поменялось на "error C2252: an explicit instantiation of a template can only occur at namespace scope".

В описании ошибки предлагается добавить "<>" после template, и заодно там явно указывается имя класса.

Вот такой пример успешно компилируется всеми имеющимися у меня версиями MS VC++, которые дружно оформляют все вызовы func, как внешние. То есть, фактически не срабатывают ни инстанциаци, ни инлайнинг.

  Скрытый текст
class Calc {

  int i;

  public:

  template <typename ArgType, typename ResType>
  ResType func (ArgType arg) { return ResType (Arg * i);   }

  template <> short func <short, short> (short);
  template <> unsigned int func <unsigned int, unsigned int> (unsigned int);

};



int f (short s, unsigned int ui) {

  Calc c;

  short s2 = c.func <short, short> (s);

  unsigned int ui2 = c.func <unsigned int, unsigned int> (ui);

  return int (s2 + ui2);

}


int main () {

  return f (-31435, 8757849873);

}


Что там нужно сделать, чтобы нужные версии функции явно инстанциировались и проинлайнились в режиме оптимизации?
template member function explicit instantiation c2252
Не могу явно инстанцировать шаблон функции-члена
Хочу в классе иметь несколько вариантов одной и той же мелкой вычислительной (а потому инлайновой) функции. Создаю шаблон:

  template <typename ArgType, typename ResType>
  ResType func (ArgType Arg) { return ResType (Arg * i);   }


Затем прямо в определении класса пытаюсь его инстанцировать:

  template short func <short, short> (short);


На что MS VC++ версий от 13.10 до 15.00 выдает "error C2252: cannot explicitly instantiate template in current scope". В 19.10 сообщение поменялось на "error C2252: an explicit instantiation of a template can only occur at namespace scope".

В описании ошибки предлагается добавить "<>" после template, и заодно там явно указывается имя класса.

Вот такой пример успешно компилируется всеми имеющимися у меня версиями MS VC++, которые дружно оформляют все вызовы func, как внешние. То есть, фактически не срабатывают ни инстанциаци, ни инлайнинг.

  Скрытый текст
class Calc {

  int i;

  public:

  template <typename ArgType, typename ResType>
  ResType func (ArgType Arg) { return ResType (Arg * i);   }

  template <> short func <short, short> (short);
  template <> unsigned int func <unsigned int, unsigned int> (unsigned int);

};



int f (short s, unsigned int ui) {

  Calc c;

  short s2 = c.func <short, short> (s);

  unsigned int ui2 = c.func <unsigned int, unsigned int> (ui);

  return int (s2 + ui2);

}


int main () {

  return f (-31435, 8757849873);

}


Что там нужно сделать, чтобы нужные версии функции явно инстанциировались и проинлайнились в режиме оптимизации?
template function member explicit instantiation c2252