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

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

Изменено 09.10.2018 18:51 watchmaker

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

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


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


Но повторю: нет это делать явно. Ну или объясняй зачем.
Re: Не могу явно инстанцировать шаблон функции-члена
Здравствуйте, Евгений Музыченко, Вы писали:

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


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


Но повторю: не надо это делать явно. Ну или объясняй зачем.