Подтвердить что ты не робот

Встроенная функция шаблона?

Мне нужны функции шаблона inline, если они включены в несколько файлов cpp? Спасибо.

template<bool> inline QString GetText();
template<> inline QString GetText<true>() {return "true";}
template<> inline QString GetText<false>() {return "false";}
4b9b3361

Ответ 1

Вы делаете это, потому что это полнофункциональные специализации и, следовательно, подчиняются правилу с одним определением, как и обычные функции.

Ответ 2

Да, вам нужен спецификатор 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

- конец примера]

Ответ 3

Нет причин для встроенного объявления шаблона, но не для полной специализации шаблона, вам не нужно добавлять ключевое слово inline для первой строки, а второе и третье - это нужно. Но каждая единица перевода, использующая шаблон, должна содержать определение шаблона, поэтому лучший способ - включить его в заголовочный файл и включить в другие cpps, которые его используют.

В стандарте С++ n3376 для 3.2/6 может быть более одного определения шаблона класса для всего приложения, поскольку определение такое же.

===============

Обновите базу answere на комментариях Джесси Хорошие (необходимо встроить шаблон для полной настройки) Спасибо Jesse Good за то, что.

Ответ 4

Кажется, что метод шаблона должен быть определен в том же файле, который строится, вам не нужно использовать ключевое слово 'inline', поскольку они были созданы в каждом файле cpp, который включает его.