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

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

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

person user1899020    schedule 16.07.2013    source источник
comment
Что вы надеетесь получить от inline функций шаблона?   -  person Oswald    schedule 16.07.2013
comment
возможный дубликат Имеет ли смысл использовать встроенное ключевое слово с шаблонами?   -  person Mark Garcia    schedule 16.07.2013


Ответы (4)


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

person user541686    schedule 16.07.2013
comment
Для шаблонных и не полностью специализированных могу убрать ключевое слово inline. Это правильно? Как 2_ - person user1899020; 16.07.2013
comment
@ user1899020: Да, можно. - person user541686; 16.07.2013

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

Явная специализация шаблона функции является встроенной только в том случае, если она объявлена ​​с помощью спецификатора inline или определена как удаленная, и независимо от того, является ли ее шаблон функции встроенным. [ Пример:

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

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

person jogojapan    schedule 16.07.2013
comment
Кажется, template<> int g<>(int) { /∗ ... ∗/ } нужно ключевое слово inline в моем тестировании. - person user1899020; 16.07.2013
comment
@user1899020 user1899020 Вы действительно прочитали ответ? Если вы включаете его в несколько файлов cpp, которые связаны друг с другом, тогда да, вам нужен встроенный. Вот что говорит пример (из Стандарта). - person jogojapan; 16.07.2013

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

person Chen    schedule 16.07.2013

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

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

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

Обновите базу ответов на комментарии Джесси Гуд (необходимо встроить для полной специализации шаблона). Спасибо, Джесси Гуд, укажите на это.

person ZijingWu    schedule 16.07.2013
comment
Вам нужно ключевое слово inline. Это шаблонные специализации, и они нарушат ODR, если будут включены в несколько исходных файлов. - person Jesse Good; 16.07.2013
comment
См. [temp.expl.spec]/12 Явная специализация шаблона функции является встроенной, только если она объявлена ​​с помощью описателя inline или определена как удаленная, и независимо от того, является ли ее шаблон функции встроенным. - person Mankarse; 16.07.2013
comment
@ZijingWu Вы имеете в виду черновик для С++ 14. В текущем C++11 соответствующий раздел — 3.2/5. Кроме того, если бы вы включили полную цитату, вы бы заметили, что явные специализации шаблонов не упоминаются как исключения в этом разделе (ни в C++11, ни в C++14). - person jogojapan; 16.07.2013
comment
@jogojapan Я не заметил, что полные явные выделения шаблонов не включены в список исключений 3.2/5. Есть ли причина, по которой стандарт рассматривает полную специализацию и функцию шаблона по-разному? Я предполагаю, что должна быть какая-то причина, но я не могу понять это. - person ZijingWu; 16.07.2013
comment
@ZijingWu Причина в том, что полностью (то есть явно) специализированные шаблоны функций больше не являются шаблонами. Они являются функциями и ведут себя так же, как и функции. (Это также отражается в том факте, что вам не потребуется явное создание экземпляра для явно специализированного шаблона функции. Явная специализация подразумевает создание экземпляра функции.) - person jogojapan; 16.07.2013