2011-09-14 16 views
12

que tienen una clase:funciones de plantillas privadas

Ch

class C { 
private: 
    template<int i> 
    void Func(); 

    // a lot of other functions 
}; 

C.cpp

// a lot of other functions 

template<int i> 
void C::Func() { 
// the implementation 
} 

// a lot of other functions 

que sé, que no es la mejor idea para mover la aplicación plantilla en cpp (porque no se verá desde otras cpp, que podría incluir el encabezado con la declaración de la plantilla).

Pero, ¿qué pasa con las funciones privadas? ¿Podría alguien decirme si hay contras de implementación de funciones de plantillas privadas en un archivo .cpp?

+0

http://stackoverflow.com/questions/4315969/where-to-define-c-class-member-template-function-and-functors-that-instantiate/4316020#4316020 –

+1

Si bien la cuestión era técnicamente respondido por Als y Nicola, para mí esto solo me lleva a preguntar por qué hiciste esto una plantilla de miembro. ¿No sería mucho mejor tener esto como una plantilla de función gratuita en (el espacio de nombre sin nombre) del archivo cpp? He descubierto que, con el tiempo, utilicé cada vez menos funciones de miembros privados, recurriendo cada vez más a funciones gratuitas en (el espacio de nombre sin nombre) del archivo de implementación de la clase. – sbi

Respuesta

10

Cuando se utiliza una plantilla de función de manera que desencadena su creación de instancias, un compilador (en algún punto) necesita ver la definición de esa plantilla. Y esa es la razón, las plantillas generalmente se implementan dentro de un archivo de cabecera usando las finalizaciones en línea.

De modo que, siempre que se cumplan las reglas anteriores, todavía está bien tener la interfaz y la implementación separadas en el encabezado y los archivos de origen.


Referencia:
C++ 03 estándar, § 14.7.2.4:

La definición de una plantilla no exportado función, una plantilla de función no exportado miembro, o una función miembro no exportada o un miembro de datos estáticos de una plantilla de clase debe estar presente en cada unidad de traducción en la que se crea una instancia explícita.

+0

¿No es esto contradictorio: 'Así que mientras se sigan las reglas anteriores, todavía está bien tener la interfaz y la implementación separadas en el encabezado y los archivos fuente' .. ** contradice ** >>' Y ese es el motivo, las plantillas son usualmente implementado dentro de un archivo de cabecera usando las terminaciones en línea. ¿O me perdí algo? – Nawaz

+0

@Nawaz: Actualizado para responder a su pregunta. Hth. –

+0

Eso no responde mi pregunta. Usted dijo que la definición puede estar en un archivo .cpp, ¿cómo? – Nawaz

6

A menos que su plantilla de función de miembro privada sea utilizada por funciones miembro que se definen en línea dentro de la definición de clase, no veo nada de malo en este enfoque. Por el contrario, creo que cuantas menos dependencias entren en tus archivos de cabecera, mejor.

Esto funcionará mientras usted haga cumplir la convención de siempre proporcionando la implementación de cada clase en un solo archivo fuente.

Cuestiones relacionadas