Ожидаемый список спецификаторов-определителей до ... Ошибка в проекте C ++ / Objective-C iPhone - PullRequest
2 голосов
/ 22 июня 2010

Итак, я прохожу первый урок в книге О'Рейли по 3D-программированию для iPhone.На этом этапе учебного курса все компоненты OpenGL ES помещаются в отдельный интерфейс C ++.Насколько я могу судить, я следовал за книгой к букве, но все же не могу понять эту ошибку компилятора.Я довольно новичок в C ++ (в основном это C # в прошлом), поэтому я уверен, что это глупо.

Ниже приведено текущее состояние всех соответствующих файлов.

У меня есть файл заголовка c ++ с именем IRenderingEngine.hpp со следующим содержимым:

enum DeviceOrientation {
    Unknown,
    Portrait,
    PortraitUpsideDown,
    LandscapeLeft,
    LandscapeRight,
    FaceUp,
    FaceDown,
};

struct IRenderingEngine* CreateRenderer1();

struct IRenderingEngine {
    virtual void Initialize(int width, int height) = 0; //Compiler error "expected specifier-qualifier-list before 'virtual'
    virtual void Render() const = 0;
    virtual void UpdateAnimation(float timeStep) = 0;
    virtual void OnRotate(DeviceOrientation newOrientation) = 0;
    virtual ~IRenderingEngine() {}
};

У меня есть файл заголовка target-c / c ++ с именем GLView.h , который выглядит следующим образом:

#import "IRenderingEngine.hpp"
#import <OpenGLES/EAGL.h>
#import <QuartzCore/QuartzCore.h>

@interface GLView : UIView {
    EAGLContext* m_context;
    IRenderingEngine* m_renderingEngine; //Compiler error: Expected specifier-qualifier-list before "IRenderingEngine"
    float m_timeStamp;
}

- (void) drawView: (CADisplayLink*) displayLink;
- (void) didRotate: (NSNotification*) notification;

@end

И, наконец, GLView.mm файл с реализацией barebones:

#import "GLView.h"


@implementation GLView

+ (Class) layerClass
{
    return [CAEAGLLayer class];
}

- (id)initWithFrame:(CGRect)frame {
    return self;
}

- (void) drawView:(CADisplayLink *)displayLink
{

}

-(void) didRotate:(NSNotification *)notification
{

}

@end

Ответы [ 6 ]

4 голосов
/ 02 июля 2010

Вам необходимо переименовать HelloArrowAppDelegate.m в файл .mm. Об этом говорится в книге на странице 20 (средний раздел с точкой пули лап). Я пропустил этот раздел и имел ту же проблему. После изменения файла на .mm программа работала.

2 голосов
/ 22 июня 2010

Это сообщение об ошибке, например происходит, если один из двух ваших заголовков включается в простой исходный файл Objective-C, который ничего не знает об обработке кода C ++.

Чтобы разрешить использование GLView из простых источников Objective-C, используйте только предварительное объявление для механизма рендеринга и не включайте заголовок C ++ в GLView.h:

// GLView.h:
struct IRenderingEngine;
@interface GLView : UIView {
    struct IRenderingEngine* m_renderingEngine;
// ...
@end

// GLView.mm:
#import "IRenderingEngine.hpp"
// ... etc.

В качестве альтернативы вы можете использовать непрозрачные указатели для переноса экземпляров C ++, чтобы сохранить интерфейс Objective-C более стабильным, см., Например, Роб Нейпирс пост на тему.

Когда это исправлено, вам все равно нужно исправить объявление для CreateRenderer1(), как указали другие - либо переслать декларацию struct IRenderingEngine; перед функцией, либо просто переместить ее после определения struct.

1 голос
/ 18 марта 2012

Это может показаться отговоркой, но у меня возникла точно такая же проблема при обновлении до XCode 4.x

Я справился с этим, загрузив исходный код с сайта О'Рейли, и только что загрузил проект. Похоже, Xcode распознал его как старый проект и настроил себя соответствующим образом; нет проблем с компиляцией, сработал первый раз. Это не то же самое, что набирать его в себе, но это работает.

1 голос
/ 03 января 2011

У меня была точно такая же проблема.Оказалось, что это связано с тем, что переименование HelloArrowAppDelegate.m в HelloArrowAppDelegate.mm в группах и файлах XCode фактически не переименовывает файл!Однажды я использовал Finder, чтобы переименовать его, и проект скомпилирован.Примечание. XCode может жаловаться, что HelloArrowAppDelegate.m отсутствует при повторном открытии проекта, просто щелкните его правой кнопкой мыши, удалите и затем используйте «Добавить существующие файлы», чтобы снова добавить файл HelloArrowAppDelegate.mm.

0 голосов
/ 22 июня 2010

Строка

struct IRenderingEngine* CreateRenderer1();

Должна идти после объявления класса IRenderingEngine.(Кроме того, если вы намеревались использовать переменную в качестве указателя на этот тип структуры, вы должны опустить скобки в ее объявлении.)

Для вашей другой ошибки, я думаю, вы хотите добавить строку с struct.

0 голосов
/ 22 июня 2010

Я считаю, что эта строка вызывает ошибку:

struct IRenderingEngine* CreateRenderer1();

Я не совсем уверен, что вы пытаетесь сделать там, но я думаю, что это нужно полностью удалить.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...