Здравствуйте, Евгений Музыченко, Вы писали:
ЕМ>Хочу в классе иметь несколько вариантов одной и той же мелкой вычислительной (а потому инлайновой) функции. Создаю шаблон:
ЕМ>ЕМ> template <typename ArgType, typename ResType>
ЕМ> ResType func (ArgType Arg) { return ResType (Arg * i); }
ЕМ>
ЕМ>Затем прямо в определении класса пытаюсь его инстанцировать:
Но зачем?!
Убери свои строки с "инстанциированием" из исходника — и всё будет работать как надо.
ЕМ>В описании ошибки предлагается добавить "<>" после template, и заодно там явно указывается имя класса.
Забавно :)
Добавление
<> — это для описания специализации.
То есть, для ситуации, когда кто-то хотел сделать специализацию, но забыл написать
<>, в справке говорят, что нужно написать
<>.
ЕМ>Вот такой пример успешно компилируется всеми имеющимися у меня версиями MS VC++, которые дружно оформляют все вызовы func, как внешние. То есть, фактически не срабатывают ни инстанциаци, ни инлайнинг.
Ну в некоторой степени это даже логично: ты добавил
<> и тем самым написал, что будет специализация. Но тело функции для специализации не предоставил. Разумеется компилятор тут ничего кроме внешнего вызова и не может сделать.
ЕМ>Что там нужно сделать, чтобы нужные версии функции явно инстанциировались и проинлайнились в режиме оптимизации?
Инстанциирование делается в namespace-scope:
class Calc { … };
template short Calc::func <short, short> (short z);
Но повторю: не надо это делать
явно. Ну или объясняй зачем.