mid left from c++ template-function

c++ - left - strcpy



función de plantilla en línea? (4)

¿Necesito funciones de plantilla en inline si están incluidas en varios archivos cpp ? Gracias.

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


Lo hace, porque esas son especializaciones de funciones completas y, por lo tanto, están sujetas a la regla de una definición al igual que las funciones normales.


No hay ninguna razón para la declaración en línea de la plantilla, pero no para la especialización completa de la plantilla, no es necesario agregar la palabra clave en línea para la primera línea, pero la segunda y la tercera la necesitan. Pero cada unidad de traducción, que usa la plantilla, necesita contener la definición de la plantilla, por lo que la mejor manera es incluirla en el archivo de cabecera e incluirla en otros cpps que la utilicen.

En el estándar C ++ n3376 para 3.2 / 6, puede haber más de una definición de plantilla de clase para toda la aplicación, dado que la definición es la misma.

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

Actualice la base de respuestas en los comentarios de Jesse Good, (necesita en línea para obtener la plantilla completa). Gracias, Jesse Good señala eso.


Parece que el método de plantilla se debe definir en el mismo archivo que se está generando. No es necesario utilizar la palabra clave "en línea" para ellos, ya que se construyeron en cada archivo cpp que lo incluye.


Sí, necesita el especificador en inline allí.

La ODR (regla de una definición) establece que debe haber exactamente una definición de variable, función, clase, enumeración o plantilla. Las excepciones relevantes para su pregunta se enumeran en §3.2 / 5 (C ++ 11) (énfasis mío):

Puede haber más de una definición de un tipo de clase (Cláusula 9), tipo de enumeración (7.2), función en línea con enlace externo (7.1.2), plantilla de clase (Cláusula 14), plantilla de función no estática (14.5.6) , miembro de datos estáticos de una plantilla de clase (14.5.1.3), función miembro de una plantilla de clase (14.5.1.1), o especialización de plantilla para la cual no se especifican algunos parámetros de plantilla (14.7, 14.5.5) en un programa siempre que cada uno la definición aparece en una unidad de traducción diferente, y siempre que las definiciones cumplan con los siguientes requisitos. [...]

Las especializaciones de plantillas para las que se especifican todos los parámetros (es decir, las especializaciones explícitas) no están enumeradas allí, y §14.7.3 / 12 dice:

La especialización explícita de una plantilla de función solo está en línea si se declara con el especificador en línea o se define como eliminada, e independientemente de si su plantilla de función está en línea. [Ejemplo:

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

- ejemplo final]