3

我正在尝试编写此头文件:

//@class AQPlayer;

//#import "AQPlayer.h"

@interface AQ_PWN_iPhoneViewController : UIViewController {

    AQPlayer* player;
}

@end

AQPlayer 是一个用 C++ 编写的 .mm 文件。

我试图在这里进行类前向声明​​,但它向我抱怨:

error: cannot find interface declaration for 'AQPlayer'

所以我尝试“#import”头文件,但它抱怨一些完全不正确和奇怪的东西。这是抱怨的错误的一部分:

在包含的文件中

/Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQPlayer.h:51,
                 from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneViewController.h:12,
                 from /Users/akaraphan/Desktop/SpecialTopic1/AQ_PWN_iPhone/Classes/AQ_PWN_iPhoneAppDelegate.m:10:
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:78: error: expected '=', ',', ';', 'asm' or '__attribute__' before 'CAStreamBasicDescription'
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:230: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:231: error: expected '=', ',', ';', 'asm' or '__attribute__' before '==' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:233: error: expected '=', ',', ';', 'asm' or '__attribute__' before '!=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:234: error: expected '=', ',', ';', 'asm' or '__attribute__' before '<=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:235: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>=' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:236: error: expected '=', ',', ';', 'asm' or '__attribute__' before '>' token
/Developer/Examples/CoreAudio/PublicUtility/CAStreamBasicDescription.h:239: error: expected ';', ',' or ')' before '&' token

我错过了什么吗?我不能为此做一个前向声明吗?

4

4 回答 4

3

执行此操作的正常方法是:

// In your .h file...
@class AQPlayer;
@interface AQ_PWN_iPhoneViewController : UIViewController {
    AQPlayer *player;
}
@end

// In your .mm file (see below why it has to be .mm instead of .m)...
#import "AQ_PWN_iPhoneViewController.h"
#import "AQPlayer.h"
@implementation AQ_PWN_iPhoneViewController
...
@end

您看到的重载错误可能是因为编译器试图解析AQPlayer.h为 Objective-C 而不是 Objective-C++。您可能必须使用.mm所有导入 AQPlayer 的源文件,即使该特定类不使用 C++。

于 2009-07-22T14:26:26.657 回答
1

我也遇到了完全相同的问题(也试图重用 Apple“SpeakHere”演示中的 AQPlayer c++ 类)。

似乎编译器感到困惑并尝试将objective-c++编译为objective-c(因此出现所有错误)。我设法通过右键单击导入 mm 文件的 m 文件并选择“getInfo”来编译它,然后将文件类型更改为“sourcecode.cpp.objcpp”

于 2009-08-16T11:46:27.143 回答
1

我已经将我的 AQ_PWN_iPhoneViewController 设置为 .mm 文件。所以不,这并不能解决问题。

这里有更多信息:如果我尝试调用 AQPlayer 实例的方法/函数,将显示错误“错误:找不到 'AQPlayer' 的接口声明”。这是一个例子:

- (void)viewDidLoad {

CFStringRef ref = (CFStringRef)[NSTemporaryDirectory() stringByAppendingPathComponent: @"1.mp3"];
player = new AQPlayer(&ref);

OSStatus result = player->StartQueue(false);

if (result == noErr)
    [[NSNotificationCenter defaultCenter] postNotificationName:@"playbackQueueResumed" object:self];

}

删除像 StartQueue 这样的任何函数调用都会使错误消失,但我确实需要调用该方法!

于 2009-07-22T14:48:57.993 回答
0

首先,你必须告诉编译器一个文件有 C++ 代码(一个文件也包括一个有 C++ 代码的文件!)。您可以通过将其重命名为 .mm 扩展名来做到这一点(.h 保持不变)。第二种方法是像 Atomoil 说的那样将文件类型设置为“sourcecode.cpp.objcpp”。

此外,如果您想对 C++ 类进行前向声明,请使用“class AQPlayer;”,而不是“@class AQPlayer;”。如果这样做,您将收到“找不到 XXX 的接口声明”错误。

我通常在 .h 文件中包含 C++ 文件,从而消除了前向声明的需要,尽管有时您不想这样做。

于 2009-12-17T14:23:56.707 回答