2009-03-26 10 views
15

Recientemente encontré este problema. Encontré muchas instancias de personas que hacen la pregunta — here, for example — pero no hay respuestas concretas.¿Qué significa cuando obtiene un error de compilación "parece una definición de función" para una declaración de clase?

Aquí está el código de ejemplo izada de ese enlace:

class AFX_BASE_APPLICATION_APP_CLASS CFileExtension 
{ 
public: 
    CFileExtension();   
    virtual ~CFileExtension(); 
}; 

El error que esto genera es:

c:\FileExtension.h(14) : error C2470: 'CFileExtension' : looks like a function definition, but there is no formal parameter list; skipping apparent body

Respuesta

38

Es casi seguro que haya perdido el encabezado que define AFX_BASE_APPLICATION_APP_CLASS. En ese caso, se pasaría inalterado y VC++ supondría que CFileExtension era una función que devolvía class AFX_BASE_APPLICATION_APP_CLASS.

Y, como cree que es una función, también cree que necesita paréntesis.

Solo tiene que encontrar donde se define AFX_BASE_APPLICATION_APP_CLASS y #include ese archivo.

+1

Tenía el mismo problema, eso lo solucionó . –

4

... y la respuesta, ya que no podía ser molestado a iniciar sesión para cualquiera de esos foros, pero ya tenía un OpenID :-)

En mi caso (y probablemente todos los que encontré), el problema era que me faltaba un #i nclude para el archivo de encabezado que contenía la definición de la macro que precede al nombre de la clase. Es muy probable que la macro se use como una forma conmutada de configuración de compilación para activar __declspec (dllexport).

La forma en que descubrí esto fue yendo a las propiedades del proyecto, "C/C++" | Preprocesador y encendido "Generar archivo preprocesado". Cuando miré la salida preprocesada, descubrí que la macro se incluía textualmente en lugar de expandirse.

+0

Tim es correcto, me acabo de enfrentar con este error y me había perdido una definición del preprocesador que habría definido la macro anterior al nombre de la clase. Una vez que se define la macro, el error se resuelve ... Para ser sincero, iba a votar la respuesta de Tim, pero descubrí que mi puntaje de Rep no era lo suficientemente alta :-) EB – echobravo

3

acaba de definir AFX_BASE_APPLICATION_APP_CLASS

6

me encontré con el mismo error del compilador. El problema era dos puntos falta

Mi código fue algo así como:

int MyClass:doSomething() { 

} 

que debería haber sido: (Nota '::' en lugar de ':'

int MyClass::doSomething() { 

} 
+1

Este también fue mi problema: en VS2010 "modo mixto", ¡donde no hay inteligencia para ayudarlo! – Melanie

0

Otra posible causa está utilizando un __declspec (dllimport) en lugar de __declspec (dllexport) o no declspec en absoluto como un prefijo de clase/función en Visual C++.

Si mezcla thi s, su clase también puede no ser reconocida como tal y usted obtiene el mismo error.

0

Tuve el mismo problema y ninguna de las soluciones funcionó. El problema que ha escrito en OP venía de la clase que incluye:

class AFX_EXT_CLASS CMyClass : public CObject 
{ 
public : 
// .... 
} 

Esta era una clase de exportación desde un DLL que quiero usar en un exe consola. Si creo la aplicación de la consola como 'using mfc' en el asistente de creación, entonces este error no estaba ocurriendo, pero esa opción da como resultado la creación de una estructura diferente de la aplicación.

De todos modos traté de incluir varios encabezados para que sepa AFX_EXT_CLASS, lo definió pero no funcionó. Para resumir, la solución es que tenemos que habilitar el uso de MFC para la aplicación para que entienda la clase exportada de MFC desde el dll. Como lo hacemos es mediante la edición del archivo y .vcproj insertar la línea UseOfMFC="2" como se muestra a continuación:

<Configurations> 
    <Configuration 
     Name="Debug|Win32" 
     OutputDirectory="$(SolutionDir)$(ConfigurationName)" 
     IntermediateDirectory="$(ConfigurationName)" 
     ConfigurationType="1" 
     UseOfMFC="2" <-------------Insert this line here 
     CharacterSet="1" 

también #include <afx.h> a StdAfx.h (lo incluí en la parte superior derecha antes del primer incluyen).

Ahora recargar, limpiar y construir el error debería desaparecer.

No había otra manera de cambiar esta opción de la configuración del proyecto. Esta opción es diferente de Propiedades del proyecto >> Propiedades de configuración >> General >> 'Uso de MFC'.

actualización

El UseOfMFC="2" truco que puede resultar útil en otros lugares, pero al parecer si sólo #include <afx.h> y cambiar la configuración project properties >> General >> 'Use of MFC' utilizar MFC en DLL compartida, que este error desaparece. Si no cambia los ajustes posteriores un error de compilación se producirá

c:\program files (x86)\microsoft visual studio 8\vc\atlmfc\include\afx.h(24) : fatal error C1189: #error : Building MFC application with /MD[d] (CRT dll version) requires MFC shared dll version. Please #define _AFXDLL or do not use /MD[d] 

Cambiar esta realidad tampoco establece UseOfMFC="2" en el archivo de proyecto, por lo que este es el camino correcto.

Cuestiones relacionadas