Мне нужны функции шаблона inline
, если они включены в несколько файлов cpp
? Спасибо.
template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
Мне нужны функции шаблона 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 (С++ 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 для первой строки, а второе и третье - это нужно. Но каждая единица перевода, использующая шаблон, должна содержать определение шаблона, поэтому лучший способ - включить его в заголовочный файл и включить в другие cpps, которые его используют.
В стандарте С++ n3376 для 3.2/6 может быть более одного определения шаблона класса для всего приложения, поскольку определение такое же.
===============
Обновите базу answere на комментариях Джесси Хорошие (необходимо встроить шаблон для полной настройки) Спасибо Jesse Good за то, что.
Кажется, что метод шаблона должен быть определен в том же файле, который строится, вам не нужно использовать ключевое слово 'inline', поскольку они были созданы в каждом файле cpp, который включает его.