Как лучше создать версию шаблонной функции?
Модераторы: Hawk, Romeo, Absurd, DeeJayC, WinMain
Есть шаблонная функция, тело функции записано в одном cpp-файле, а вызывается она из других cpp-файлов. Сейчас в качестве временного костыля за телом шаблонной функции в том же файле следует другая функция, в теле которой вызываются все версии шаблонной функции, кроме явно специализированных. Единственное назначение этой костыльной функции - создать версии шаблонной функции, если её убрать, то среда начинает ругаться, на то, что линкер не знает версий шаблонной функции. Если тело шаблонной функции в нести в заголовочный файл и инкладить во все вызывающие файлы, то при наличии даже одной явной специализации начинается ругань на multiple dfinition. Или на сам шаблон, если все явные специализации в отдельном cpp-файле, или на явные специализации, если они находятся в заголовочном. Как избавиться от костыльной функции и всё таки создать версии шаблонной функции, но не специализировать их все?
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Для явного инстанцирования используется вот такой синтаксис:
И, кстати, это легко находится в первой же ссылке в гугле, если его спросить о явном инстанцировании...
Код: Выделить всё
template<typename T>
void Function()
{
}
template void Function<int>();
template void Function<double>();
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Так я так и хотел. Проблема в том, что при наличии явных специализаций не вычищает.Absurd писал(а):Обычно шаблоны пишут в .h файлах. Дублирующиеся инстанциации потом вычищает линковщик.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Явное инстанцирование используется для случаев, когда нужно заэкпортить из библиотеки (или из единицы трансляции) инстансы функции только для данного списка типов. В таком случае в хедере размещают лишь объявление шаблона, а в каком-нибудь cpp размещают определение шаблона и потом делают явное инстансирование.Absurd писал(а):Обычно шаблоны пишут в .h файлах. Дублирующиеся инстанциации потом вычищает линковщик.
Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
Первой же ссылке сотой страницы или двухсотой?Romeo писал(а):И, кстати, это легко находится в первой же ссылке в гугле, если его спросить о явном инстанцировании...
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
Тот самый случай. Только не из библиотеки.Romeo писал(а):Явное инстанцирование используется для случаев, когда нужно заэкпортить из библиотеки (или из единицы трансляции) инстансы функции только для данного списка типов.
И получаем мультипальную дефиницию. Спасибо.Romeo писал(а):В таком случае в хедере размещают лишь объявление шаблона, а в каком-нибудь cpp размещают определение шаблона и потом делают явное инстансирование.
Писать можно на чём угодно, но зачем же так себя ограничивать? Пиши на c.
-
- Сообщения: 1228
- Зарегистрирован: 26 фев 2004, 13:24
- Откуда: Pietari, Venäjä
- Контактная информация:
Что такое "явная специализация"? Ты точно не путаешь ее с частичной (partial) специализацией? Просто в том коде который у тебя не работал в соседней ветке ты попытался (криво) сделать именно частичную специализацию шаблона для типа int.Проблема в том, что при наличии явных специализаций не вычищает.
2B OR NOT(2B) = FF
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
У тебя тело, просто, не в хедере, а в cpp файле. Absurd верно говорит о том, что можно перенести тело в хедер - это тоже решит проблему. Но решение с явным инстансированием более строгое, если эта строгость, конечно, тебе нужна. Вообще, мне кажется, что такая строгость тебе не нужна, и ты просто не понимаешь толком, как работают шаблоны, раз такой вопрос возникСионист писал(а):Так я так и хотел. Проблема в том, что при наличии явных специализаций не вычищает.

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
- Romeo
- Сообщения: 3126
- Зарегистрирован: 02 мар 2004, 17:25
- Откуда: Крым, Севастополь
- Контактная информация:
Он путает её с явным инстанцированием сейчасAbsurd писал(а):Что такое "явная специализация"? Ты точно не путаешь ее с частичной (partial) специализацией? Просто в том коде который у тебя не работал в соседней ветке ты попытался (криво) сделать именно частичную специализацию шаблона для типа int.

Entites should not be multiplied beyond necessity @ William Occam
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.
---
Для выделения С++ кода используйте конструкцию [ code=cpp ] Код [ /code ] (без пробелов)
---
Сообщение "Спасибо" малоинформативно. Благодарность правильнее высказать, воспользовавшись кнопкой "Reputation" в виде звёздочки, расположенной в левом нижнем углу рамки сообщения.