2012-01-13 20 views
8

Soy un novato en C++. Hoy en día, tengo un problema: en el archivo de cabecera, que definir una clase:Error de C++: No se encontró la declaración del miembro

template<class T> class Ptr_to_const { 
private: 
    Array_Data<T>* ap; 
    unsigned sub; 

public: 
     ... 

    Ptr_to_const<T> & operator=(const Ptr_to_const<T> & p); 

}; 

y en el archivo de origen, programo como:

template<class T> Ptr_to_const<T>& Ptr_to_const<T>::operator=(
     const Ptr_to_const<T> & p) { 
     ... 
    return *this; 
} 

cuando se compila, compilador siempre dicen: 'miembro declaración no encontrada '. ¿por qué?

utilizo Eclipse CDT + Cygwin GCC

muchas gracias!

+1

AFAIK no debería implementar una clase de plantilla en un archivo fuente. Establezca la definición de la función en el encabezado. – Lucian

Respuesta

6

Las clases de plantilla deben declararse y definirse en el encabezado, u otro archivo incluido por los usuarios. No se pueden declarar en un encabezado y se pueden definir en un archivo fuente como de costumbre.

El razonamiento es que la plantilla debe reemplazarse con un tipo real y la fuente generada y compilada cuando se usa, y el compilador ciertamente no puede precompilar plantillas para todos los tipos posibles que puedan aparecer, por lo que los usuarios deben ser capaz de manejar eso (y por lo tanto, necesita acceso al código).

Esto causa algunos problemas al pasar objetos, si varias bibliotecas incluyen las mismas plantillas, ya que pueden compilarse con diferentes versiones del encabezado (consulte la Regla de una sola definición).

0

Debe incluir el archivo de origen al final del archivo de cabecera o definir la función miembro en el archivo de cabecera cuando se define una clase de plantilla

1

"declaración miembros no encontrado" es un error producido por el análisis estático Eclipse herramienta (codan) en lugar de compilador. Si obtiene este error, pero la compilación tiene éxito, esto es un falso positivo. Las versiones anteriores de esta herramienta son conocidas por dar algunos falsos positivos, ver por ejemplo this bug report. Entonces recomiendo actualizar Eclipse CDT a la versión más reciente. Si esto no ayuda, envíe un informe de error a Eclipse CDT.

Sin embargo, si también obtiene los errores del compilador (estos están indicados por C/C++ Problema en la columna Tipo en la vista Problemas), entonces probablemente haya olvidado incluir el archivo de encabezado.

Cuestiones relacionadas