Re: Не могу явно инстанцировать шаблон функции-члена
От: watchmaker  
Дата: 09.10.18 18:44
Оценка: +1
Здравствуйте, Евгений Музыченко, Вы писали:

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


ЕМ>
ЕМ>  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);


Но повторю: не надо это делать явно. Ну или объясняй зачем.
Отредактировано 09.10.2018 18:51 watchmaker . Предыдущая версия . Еще …
Отредактировано 09.10.2018 18:45 watchmaker . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.