Objective c 为什么我会得到这个错误;错误:未知类型名称';虚拟'&引用;当试图编译此代码时?

Objective c 为什么我会得到这个错误;错误:未知类型名称';虚拟'&引用;当试图编译此代码时?,objective-c,ios,xcode,opengl-es,Objective C,Ios,Xcode,Opengl Es,代码: 从一本3d iphone编程的书中学习opengles,它使用了这个示例代码,但这本书是针对xcode 3.x的 不知何故,我觉得它与xcode 4有关 编辑: 以下是实际误差: /Users/Dan/Documents/opengles/Hello-Arrow/Hello-Arrow/IRenderingEngine.hpp:27:2:错误:未知类型名称“virtual”[1] 合法地说,这就是编译失败的全部原因,绝对没有其他文件。(是的,我试过用main.m和这个hpp文件编译) 不

代码:

从一本3d iphone编程的书中学习opengles,它使用了这个示例代码,但这本书是针对xcode 3.x的

不知何故,我觉得它与xcode 4有关

编辑:

以下是实际误差:

/Users/Dan/Documents/opengles/Hello-Arrow/Hello-Arrow/IRenderingEngine.hpp:27:2:错误:未知类型名称“virtual”[1]

合法地说,这就是编译失败的全部原因,绝对没有其他文件。(是的,我试过用main.m和这个hpp文件编译)

不过,它将hpp文件识别为cpp头文件,如果我尝试将其添加到编译文件中,它会说“没有规则处理sourcecode.cpp.h类型的文件“$(PROJECT_DIR)/Hello Arrow/IRenderingEngine.hpp(适用于体系结构i386)”,因此我真的不知道发生了什么

请注意,我使用main.m编译,这意味着我编译了另一个基于Cocoa/Foundation的应用程序

我试着编译C++应用程序,一切都很好。 类似地,使用main.mm测试文件编译也可以很好地工作

这是实际的项目,让我知道我有多疯狂:


[考虑到我丢失了文件而删除]

这只是一个愚蠢的猜测,因为我从未尝试在C编译器中使用虚拟这个词来编译某些东西。。。但是,你有没有可能尝试把这个C++代码编译成C代码?这是我唯一能想到编译器不能理解关键字Virtual.t/p>的原因。在C++程序中,头不是正确的。当我用C的STDIO库的C++版本替换它时,你的代码就为我编译了。

< P>请将Ma.m重命名为Me.mm。这对我很有用。

如果您使用的是Xcode 4,请尝试将文件名“AppDelegate.m”更改为“AppDelegate.mm”。它适合我。

将文件名“AppDelegate.m”更改为“AppDelegate.mm”。没错

> p>我将C++导入的“IrEnDrimeEngult.HPP”行从GLVIEW .h文件移到GLVIEW.mm——这防止了在编译时将其导入Meal.m和HeloLogARPAPPux.T.m文件中,并将导入到.mm文件中的限制,可以处理C++ ++ /p/p>
我还必须为我在输入代码时引入的bug做一些其他的修复——因此,如果这不是唯一需要做的事情,我深表歉意,但它可能会帮助那些有类似问题的人一个SSCCE。我不能帮你处理这段代码,它显然不是问题的真正根源。实际上是整个文件,它不会编译。只是抛出错误:未知类型名称“virtual”[1]a
main.m
是什么意思?C++不使用<代码> .M/COD>文件。使用
.cpp
我编译了一个cocoa应用程序,它使用.m文件。除非您使用.mmsupploy-xcode,否则它不是Objective-C++。xcode是根据文件类型编译文件的(这一类型恰好是hpp,所以我猜它足够聪明,知道这意味着它是cpp)当我尝试将其添加到标题时,会出现错误,即找不到该文件。我必须使用.mm扩展名重命名main.m和AppDelegate.m。为了使此示例在xcode 4中工作,我还必须删除MainstryBoard_iPhone.storyboard和MainstryBoard_iPad.storyboard文件,并从HelloArrow-Info.plist中删除它们的引用,但这些错误更为明显。这对我很有效!非常简单的解决方案,只需将所有实例变量移动到@implementation中即可。
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() {}
};