Хочу в классе иметь несколько вариантов одной и той же мелкой вычислительной (а потому инлайновой) функции. Создаю шаблон:
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);
}
|
| |
Что там нужно сделать, чтобы нужные версии функции явно инстанциировались и проинлайнились в режиме оптимизации?