为什么在尝试编译此代码时会出现错误“error:unknown type name'virtual'”?

时间:2011-11-18 03:10:27

标签: objective-c ios xcode opengl-es

代码:

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() {}
};

从一本书中学习用于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头文件,但如果我尝试将其添加到编译文件中,则表示“没有规则处理文件'$(PROJECT_DIR)/ Hello Arrow / IRenderingEngine.hpp'类型用于体系结构i386的sourcecode.cpp.h“所以我真的不知道发生了什么

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

我尝试编译一个c ++应用程序,一切都很好...... 同样使用main.mm测试文件进行编译也可以正常工作

继续实际的项目,让我知道我真的很疯狂:

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

7 个答案:

答案 0 :(得分:22)

请将main.m重命名为main.mm.这对我有用。

答案 1 :(得分:2)

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

答案 2 :(得分:2)

将文件“AppDelegate.m”的名称更改为“AppDelegate.mm”。这是对的!

答案 3 :(得分:2)

我将#import“IRenderingEngine.hpp”行从GLView.h文件移动到GLView.mm - 这阻止了它们在编译时被导入main.m和HelloArrowAppDelegate.m文件 - 并限制了导入.mm文件,可以处理C ++。

我还必须为我在输入代码时引入的错误做一些其他的修复 - 如果这不是唯一需要完成的事情,那么道歉,但它可能会帮助那些有类似问题的人!

答案 4 :(得分:1)

如果你调用C ++文件(即使你只导入它们),你需要更改调用它的.m文件.mm

答案 5 :(得分:0)

这只是一个愚蠢的猜测,因为我从来没有尝试在C编译器中使用virtual这个词进行编译......但是你有没有机会尝试将这个C ++代码编译为C代码?这是我能想到编译器无法理解关键字virtual的唯一原因。

答案 6 :(得分:0)

标题< stdlib.h>是不适合在C ++程序中使用的。当我用C的stdio库< cstdlib>的c ++版本替换它时然后你的代码为我编译。