Qt Creator: "función en línea utilizada pero nunca definida" - ¿por qué?
-
07-07-2019 - |
Pregunta
¿Por qué recibo esta advertencia en Qt Creator: `inline function 'bool Lion :: growl ()' utilizada pero nunca definida?
Verifiqué dos veces mi código y tengo una declaración
en línea bool growl ()
en Lion
( lion.h
)
y la implementación correspondiente en lion.cpp
:
en línea bool Lion :: growl ()
¿Qué está pasando?
EDITAR: mi suposición ha sido que es legal definir el método en línea real en el archivo .cpp (la palabra clave inline
alerta al compilador para buscar el cuerpo del método en otro lugar), o estoy equivocado?
No quiero saturar mis archivos de encabezado con detalles de implementación.
Solución
Bueno, no sé el problema exacto, pero para empezar:
- Se supone que los métodos en línea se implementarán en el archivo de encabezado. El compilador necesita conocer el código para realmente alinearlo .
- También usando el " en línea " La palabra clave en la declaración de clase no tiene ningún efecto. Pero tampoco puede doler.
Consulte también: c ++ faq lite
Otros consejos
Se supone que los métodos en línea se implementarán en el archivo de encabezado. los el compilador necesita conocer el código para realmente incorporarlo.
Excepto si la función en línea se usa en el mismo proyecto, posiblemente en otro archivo que #incluye su encabezado.
Echo de menos que haya una restricción para las bibliotecas porque restringir los encabezados para que funcionen con los prototipos hace que las cosas sean más legibles.
¿Qué pasa con #include -ing el .cpp?
Además de lo que dijo Johan, no puede tener una definición y una declaración separadas para la función, incluso si ambas están en el mismo archivo de encabezado. Esto es cierto especialmente para las funciones miembro de las clases. El código de función debe tener la forma:
class someClass
{
void someFunc()
{ ... }
}
// This will make the function inline even w/o the explicit 'inline'
Y NO de la forma
class someClass
{
public:
void someFunc();
}
void someClass::someFunc()
{ ... }