Нужно ли мне inline
шаблонные функции, если они включены в несколько cpp
файлы? Благодарю.
template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
Вы делаете, потому что это полные функциональные специализации, и поэтому подчиняются правилу единого определения, как обычные функции.
Да, вам нужно inline
Спецификатор есть.
ODR (правило одного определения) гласит, что должно быть ровно одно определение переменной, функции, класса, перечисления или шаблона. Исключения, относящиеся к вашему вопросу, перечислены в п. 3.2 / 5 (C ++ 11) (выделено мной):
Может быть более одного определения типа класса (раздел 9), типа перечисления (7.2), встроенной функции с внешней связью (7.1.2), шаблона класса (раздел 14), шаблона нестатической функции (14.5.6) статический член данных шаблона класса (14.5.1.3), функция-член шаблона класса (14.5.1.1) или специализация шаблона, для которого не указаны некоторые параметры шаблона (14.7, 14.5.5) в программе при условии, что каждое определение появляется в отдельной единице перевода, и при условии, что определения удовлетворяют следующим требованиям. […]
Шаблонные специализации для которых все параметры указаны (то есть явные специализации) там не перечислены, а в §14.7.3 / 12 говорится:
Явная специализация шаблона функции является встроенной, только если он объявлен с помощью встроенного спецификатора или определен как удаленный, и независимо от того, является ли его функция
Шаблон встроен. [ Пример:template<class T> void f(T) { /∗ ... ∗/ } template<class T> inline T g(T) { /∗ ... ∗/ } template<> inline void f<>(int) { /∗ ... ∗/ } // OK: inline template<> int g<>(int) { /∗ ... ∗/ } // OK: not inline
— конец примера]
Кажется, что метод шаблона должен быть определен в том же файле, который создается. Вам не нужно использовать ключевое слово ‘inline’, поскольку они были встроены в каждый файл cpp, который его включает.
Нет никаких оснований для встроенного объявления шаблона, но не для полной специализации шаблона, вам не нужно добавлять ключевое слово inline для первой строки, но для второй и третьей нужно это.
Но каждая единица перевода, которая использует шаблон, должна содержать определение шаблона, поэтому лучший способ — включить его в заголовочный файл и включить в другие cpps, которые его используют.
В стандарте C ++ n3376 для 3.2 / 6 может быть более одного определения шаблона класса для всего приложения, если оно одно и то же.
===============
Обновите базу данных ответов на комментарии Джесси Гуд (требуется полная специализация шаблона). Спасибо, Джесси Гуд, отметили это.