2011-11-18 18 views
10

Código:¿Por qué aparece el error "error: nombre de tipo desconocido 'virtual'" cuando intento compilar este código?

struct IRenderingEngine { 
    virtual void Initialize(int width, int height) = 0; 
    virtual void Render() const = 0; 
    virtual void UpdateAnimation(float timeStep) = 0; 
    virtual void OnRotate(DeviceOrientation newOrientation) = 0; 
    virtual ~IRenderingEngine() {} 
}; 

OpenGLES Aprender de un libro para la programación iphone 3d y que utiliza este código de ejemplo pero el libro está dirigido a 3.x Xcode

De alguna manera siento que es algo con Xcode 4. ...

EDIT:

Heres el error real:

/Usuarios/Dan/Documentos/OpenGLES/infierno o Arrow/Hello Arrow/IRenderingEngine.hpp: 27: 2: error: nombre de tipo desconocido 'virtual' [1]

Y eso es todo lo que se necesita para no compilar, absolutamente ningún otro archivo. (Sí, he intentado compilar literalmente main.m y este archivo hpp)

Reconoce el archivo hpp como un archivo de encabezado cpp, si intento agregarlo a los archivos compilados, dice que "no regla para procesar el archivo '$ (PROJECT_DIR)/Hello Arrow/IRenderingEngine.hpp' de tipo sourcecode.cpp.h para la arquitectura i386 "así que realmente no tengo idea de qué está pasando

Tenga en cuenta que compilé con main.m lo que significa que compilé otra aplicación basada en Cocoa/Foundation

Intenté compilar para una aplicación en C++ y todo salió bien ... De manera similar, compilar con un archivo de prueba main.mm funcionó bien también

aquí está el proyecto real, déjame saber lo loco realmente soy:

[Eliminado teniendo en cuenta que el archivo perdido]

+2

Poner un SSCCE. No puedo ayudarte con este código, obviamente no es la fuente real del problema. – Puppy

+0

http://pastie.org/private/07cebz0irqp6ehybicctw es literalmente el archivo completo y no se compilará. simplemente arroja el error: nombre de tipo desconocido 'virtual' [1] – DanZimm

+0

¿Qué quiere decir un 'main.m'? C++ no usa archivos '.m'. Use un '.cpp' – Adam

Respuesta

22

Cambie el nombre del main.m al main.mm. Esto funcionó para mí.

+5

Tuve que cambiar el nombre tanto de main.m como de AppDelegate.m con la extensión .mm. – jessecurry

+0

Para que este ejemplo funcione en xcode 4, también tuve que eliminar los archivos MainStoryboard_iPhone.storyboard y MainStoryboard_iPad.storyboard, así como eliminar sus referencias de HelloArrow-Info.plist, pero los errores fueron mucho más claros. – Lockyer

0

Ésta es sólo una suposición estúpida ya que nunca he intentado compilar algo con la palabra virtual en un compilador de C ... pero ¿hay alguna posibilidad de que estuvieras tratando de compilar este código de C++ como código C? Esa es la única razón por la que puedo pensar que un compilador no entendería la palabra clave virtual.

+0

supuestamente xcode está compilando los archivos en función de sus tipos de archivos (que esta vez es hpp, así que supongo que es lo suficientemente inteligente como para saber que eso significa que es cpp) – DanZimm

0

El encabezado <stdlib.h> no es el correcto para usar en un programa C++. Cuando lo reemplacé con la versión de C++ de la biblioteca stdio de C <cstdlib>, entonces su código compilado para mí.

+0

cuando intento agregar eso al encabezado. No encuentro el archivo – DanZimm

+0

He editado la respuesta con el nombre correcto de la biblioteca. Probar ahora. –

+0

mismo problema que antes – DanZimm

2

Si está utilizando Xcode 4, intente cambiar el nombre del archivo "AppDelegate.m" a "AppDelegate.mm". Esto funciona para mi.

2

Cambiando el nombre del archivo "AppDelegate.m" a "AppDelegate.mm". ¡Es correcto!

2

moví el import línea "IRenderingEngine.hpp" del archivo GLView.h a la GLView.mm - esto evitó que se importa en los archivos HelloArrowAppDelegate.m main.m y cuando se compilaron - y restringidos la importación en el archivo .mm, que podría manejar el C++.

También tuve que hacer un par de otras correcciones para errores que había introducido al escribir el código, así que me disculpo si eso no era lo único que tenía que hacer, pero podría ayudar a aquellos con problemas similares !

+0

¡Esto funcionó para mí! Solución muy simple, solo mueva todas sus variables de instancia a @implementation. – John

1

si se llama a los archivos de C++ (incluso si sólo importarlos) necesita cambiar el archivo .m que la llamada de que .MM

Cuestiones relacionadas