views:

51

answers:

1

Hello !

I have a C++ class I would like to use in an iPhone/iPad project.
I created this file in different ways (like with "New File" => C++) and the error is always the same.

When I compile the project without having any #import (of the .h C++ class), it's ok.

But as soon as I #import the header file in one of my header objective-c file, I get error like :

error: vector: No such file or directory

or

error: expected '=', ',', ';', 'asm' or 'attribute' before ':' token"

I tried setting different values to the file type (of C++ class) in File Info, renaming my objc class in .mm etc, but it doesn't seem to work.

So I must have missed something about importing the .h c++ class in the objc header file, but what :p ^^

SOLUTION thanks to Vlad
1°) To include the header c++ file :

#ifdef __cplusplus
    #include "Triangulate.h"
#endif

2°) Renaming the objc file in .mm AND in his File Info (right clic) setting file type as sourcecode.cpp.objcpp

Thanks for helping !
Vincent

+1  A: 

Note: Xcode requires that file names have a “.mm” extension for the Objective-C++ extensions to be enabled by the compiler.

Trying to use C++ in Objective-C code residing in a file with .m extension is the most probable cause of the problem because compiler just does not recognize C++ constructs according to the error message. Renaming your .m file to .mm should help.

For more details, see Using C++ with Objective-C.

Assuming you want to use an Objective-C class in an Objective-C++ source file, there's no problem at all. The only restriction is that your .h file must be Objective-C clean. This means that you can't use any C++-isms in it, or that if you do you must wrap them all in #ifdef __cplusplus. The header will be compiled in ObjC mode when it's #included by a plain Objective-C file, so it has to eliminate any C++isms for that situation (1). So your Objective-C header file should include C++ header like this:

#ifdef __cplusplus
# include MyCPPHeader.h
#endif
Vlad Lazarenko
As I said in my question, I tried. And it doesn't work. Maybe I missed something.
Vinzius
See the last paragraph I've just added. If you mix `.m` and `.mm`, you have to wrap C++ inclusions so that `.m` files will not see C++ included in Objective-C++.
Vlad Lazarenko
My My My. I tried things but it doesn't work :-( I have read all the cocoadev.com page and maybe my solution is to recode all the c++ class in objc -_- I tried using "#ifdef __cplusplus" then in the .mm the compiler doesn't recognize the new c++ class -_- All without thinking that after I need to use this .mm class in objc basic files. So first solution, I forget about using c++ here xD second solution I get a miracle xD
Vinzius
If I wrap the include with "#ifdef __cplusplus", then I don't get error. But if I use a c++ class name then in the .mm, I get error saying my object doesn't exist :/ I tried wrapping it too, but nothing is called during the run :/ (I put a NSLog), any idea ?
Vinzius
Yeah, it looks like you messed up with stuff... It should work out of the box if none of those problems exist. Try to rename `.h` file into `.hpp` maybe? Who knows, maybe your compiler treats `.h` header as C source instead of C++ :) IDK...
Vlad Lazarenko
@Vinzius: It means __cplusplus is not defined even though file has `.mm` extension. That is weird. Try going trough project settings and see what could possibly prevent Xcode from treating `.mm` files right.
Vlad Lazarenko
It works now ^^ thanks. It wasn't the hpp but setting the .mm as .cpp.objcpp in File Info (AND doing #ifdef __cplusplus #include "Triangulate.h" #endif) THANKS ^^ It compile without error (for the moment :p)
Vinzius
It is weird Xcode didn't change meta info when you renamed `.m` into `.mm`. Anyways, if it works it works! Congrats!
Vlad Lazarenko