Thursday, May 5, 2011

Xcode 'invalid conversion' when using objective-c++

So if I run my program with the implementation as .m it works fine. Just changing it to .mm causes this line…

CGContextRef myContext = [[NSGraphicsContext currentContext] graphicsPort];

to throw this error…

error: invalid conversion from 'void*' to 'CGContext*'

Anyone have any ideas why just changing that would make it blow up, or how to fix it?

From stackoverflow
  • C allows converting void * to arbitrary type, C++ does not. Once your file is .mm it is compiled as C++:

    cristi:tmp diciu$ cat test.c
    int main()
    {
        char * t = "test";
        void * m = t;
        char * g;
    
        g=m;
    
    }
    
    cristi:tmp diciu$ g++ test.c
    test.c: In function ‘int main()’:
    test.c:7: error: invalid conversion from ‘void*’ to ‘char*’
    
    cristi:tmp diciu$ gcc test.c
    

    To fix, cast to proper type, i.e. explicitly cast "void *" to "CGContext *".

  • C++ does not allow implicit type casting from void*. In this case, the implicit converstion from void* (the return type of -[NSGraphicsContext graphicsPort]) a CGContextRef is illegal. You can make the conversion explicit like this:

    CGContextRef myContext = static_cast<CGContextRef>([[NSGraphicsContext currentContext] graphicsPort]);
    

    See this SO question for a discussion of the C++ static_cast operator.

0 comments:

Post a Comment