Utilizar adecuadamente Objective C ++
Estoy codificando una aplicación para iOS y recientemente he incluido un archivo de cabecera de C ++ en un archivo de implementación de Objective C (.m). Cambié la extensión de .m a .mm y esperé que todo funcionara sin problemas.
Inesperadamente obtuve varios errores de compilación en el archivo .h de mi clase de C ++.
Tales como: "C ++ requiere un especificador de tipo para todas las declaraciones" y "Miembro duplicado ...".
¿Alguien sabe qué podría estar causando esto?
Editar: he agregado el archivo de encabezado de C ++ para el contexto:
<code>#ifndef __CAAudioUnitOutputCapturer_h__ #define __CAAudioUnitOutputCapturer_h__ #include <AudioToolbox/ExtendedAudioFile.h> /* Class to capture output from an AudioUnit for analysis. example: CFURL fileurl = CFURLCreateWithFileSystemPath(NULL, CFSTR("/tmp/recording.caf"), kCFURLPOSIXPathStyle, false); CAAudioUnitOutputCapturer captor(someAU, fileurl, 'caff', anASBD); { captor.Start(); ... captor.Stop(); } // can repeat captor.Close(); // can be omitted; happens automatically from destructor */ class CAAudioUnitOutputCapturer { public: enum { noErr = 0 }; CAAudioUnitOutputCapturer(AudioUnit au, CFURLRef outputFileURL, AudioFileTypeID fileType, const AudioStreamBasicDescription &format, UInt32 busNumber = 0) : mFileOpen(false), mClientFormatSet(false), mAudioUnit(au), mExtAudioFile(NULL), mBusNumber (busNumber) { CFShow(outputFileURL); OSStatus err = ExtAudioFileCreateWithURL(outputFileURL, fileType, &format, NULL, kAudioFileFlags_EraseFile, &mExtAudioFile); if (!err) mFileOpen = true; } void Start() { if (mFileOpen) { if (!mClientFormatSet) { AudioStreamBasicDescription clientFormat; UInt32 size = sizeof(clientFormat); AudioUnitGetProperty(mAudioUnit, kAudioUnitProperty_StreamFormat, kAudioUnitScope_Output, mBusNumber, &clientFormat, &size); ExtAudioFileSetProperty(mExtAudioFile, kExtAudioFileProperty_ClientDataFormat, size, &clientFormat); mClientFormatSet = true; } ExtAudioFileWriteAsync(mExtAudioFile, 0, NULL); // initialize async writes AudioUnitAddRenderNotify(mAudioUnit, RenderCallback, this); } } void Stop() { if (mFileOpen) AudioUnitRemoveRenderNotify(mAudioUnit, RenderCallback, this); } void Close() { if (mExtAudioFile) { ExtAudioFileDispose(mExtAudioFile); mExtAudioFile = NULL; } } ~CAAudioUnitOutputCapturer() { Close(); } private: static OSStatus RenderCallback( void * inRefCon, AudioUnitRenderActionFlags * ioActionFlags, const AudioTimeStamp * inTimeStamp, UInt32 inBusNumber, UInt32 inNumberFrames, AudioBufferList * ioData) { if (*ioActionFlags & kAudioUnitRenderAction_PostRender) { CAAudioUnitOutputCapturer *This = (CAAudioUnitOutputCapturer *)inRefCon; static int TEMP_kAudioUnitRenderAction_PostRenderError = (1 << 8); if (This->mBusNumber == inBusNumber && !(*ioActionFlags & TEMP_kAudioUnitRenderAction_PostRenderError)) { OSStatus result = ExtAudioFileWriteAsync(This->mExtAudioFile, inNumberFrames, ioData); if (result) DebugMessageN1("ERROR WRITING FRAMES: %d\n", (int)result); } } return noErr; } bool mFileOpen; bool mClientFormatSet; AudioUnit mAudioUnit; ExtAudioFileRef mExtAudioFile; UInt32 mBusNumber; }; #endif // __CAAudioUnitOutputCapturer_h__ </code>