Почему я получаю ошибку "ошибка: неизвестное имя типа" virtual "при попытке скомпилировать этот код?

код:

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 из книги для программирования 3d iphone и использует этот пример кода, но книга предназначена для xcode 3.x

Как-то я чувствую себя чем-то с xcode 4....

EDIT:

Возникает фактическая ошибка:

/Пользователи/Dan/Documents/opengles/Hello Arrow/Hello Arrow/IRenderingEngine.hpp: 27: 2: ошибка: неизвестное имя типа 'virtual' [1]

И это законно - это все, что требуется, чтобы не скомпилировать, абсолютно никаких других файлов. (Да, я пробовал компилировать буквально main.m и этот файл hpp)

Он распознает файл hpp как заголовочный файл cpp, хотя, если я попытаюсь добавить его в скомпилированные файлы, он говорит, что "нет правила обрабатывать файл" $(PROJECT_DIR)/Hello Arrow/IRenderingEngine.hpp 'типа sourcecode.cpp.h для архитектуры i386 ", поэтому я действительно не знаю, что происходит

Обратите внимание, что я скомпилирован с main.m, то есть я скомпилировал другое приложение Cocoa/Foundation

Я пробовал компиляцию для приложения С++, и все получилось просто отлично.... Точно так же компиляция с тестовым файлом main.mm тоже работала нормально

heres the actual project, lemme знаю как безумный я действительно:

[Удалено, если я потерял файл]

Ответ 1

Переименуйте main.m на main.mm. Это сработало для меня.

Ответ 2

Если вы используете Xcode 4, попробуйте изменить имя файла "AppDelegate.m" на "AppDelegate.mm". Это работает для меня.

Ответ 3

Изменение имени файла "AppDelegate.m" на "AppDelegate.mm". Это правильно!

Ответ 4

Я переместил строку #import "IRenderingEngine.hpp" из файла GLView.h в GLView.mm - это помешало ему импортироваться в файлы main.m и HelloArrowAppDelegate.m, когда они были скомпилированы, и ограничил импортировать в файл .mm, который может обрабатывать С++.

Мне также пришлось сделать пару других исправлений для ошибок, которые я вводил при вводе кода, поэтому извиняюсь, если это не единственное, что нужно сделать, но это может помочь тем, у кого есть подобные проблемы!

Ответ 5

если вы вызываете файлы С++ (даже если вы их импортируете), вам нужно изменить файл .m, который вызывает его .mm

Ответ 6

Это просто глупое предположение, поскольку я никогда не пытался компилировать что-то со словом virtual в компиляторе C... но есть ли вероятность, что вы пытались скомпилировать этот код на С++ как код C? Единственная причина, по которой я могу думать, что компилятор не понял бы ключевое слово virtual.

Ответ 7

Заголовок < stdlib.h > не подходит для использования в программе на С++. Когда я заменил его на С++-версию библиотеки C stdio <cstdlib> то ваш код скомпилирован для меня.