Outpost Universe Forums

Projects & Development => Outpost 2 Programming & Development => Topic started by: Vagabond on November 26, 2016, 09:54:17 AM

Title: Unable to use Outpost2 TYPEDEF Export in custom class
Post by: Vagabond on November 26, 2016, 09:54:17 AM
I was happily coding a custom class for Outpost 2 and I wanted a couple of the class member functions to be passable to Outpost 2 triggers. The problem is I'm using #include <vector>, so when I add the Export TYPEDEF to a member function, I get the following error: linkage specification is not allowed.

I googled the problem and found what appears to be a nice writeup by a gentleman named Michael Burr: http://stackoverflow.com/questions/20139642/c2732-linkage-specification-error

Following his instructions, I enclosed the header file like this:

Code: [Select]
#if __cplusplus
extern "C" {
#endif

#include "Outpost2DLL\Outpost2DLL.h"
#include <cmath>
#include <vector>

class DisasterHelper
{
public:
    Export void DisasterHelper::CreateRandomDisaster();
   
    ... MORE BAD CODE BY VAGABOND...

};
#if __cplusplus
}
#endif
ERRORS
Then when compiling the source code, I get multiple of the following two errors:


RESULTS/QUESTIONS
1.  Does this mean if I want to include C++ only classes in a custom Outpost 2 class, the class cannot contain the TYPEDEF Export?

2.  The issue with cmath might be caused by an issue with my project settings, not sure. I'm getting the following caution when building a working copy of the scenario: LNK4098 defaultlib 'LIBCMTD' conflicts with use of other libs; use /NODEFAULTLIB:library, which I have not really investigated yet.

I could fall back to c style arrays and just manage the array sizes manually. I would rather not though (call me lazy if you want), so just looking for feedback if the only options for a custom class are either to not use VECTOR or to not use Export.
Title: Re: Unable to use Outpost2 TYPEDEF Export in custom class
Post by: Arklon on November 26, 2016, 06:28:37 PM
Things using C++ features, meaning STL stuff or functions inside classes, can't have extern C linkage. You could technically use C++-style exports with triggers, but you have to use their mangled name, which isn't very straightforward. Also, the Export macro expands to 'extern "C" __declspec(dllexport)'.
Title: Re: Unable to use Outpost2 TYPEDEF Export in custom class
Post by: Hooman on December 01, 2016, 04:39:30 AM
Keep in mind a class member function needs to be passed the hidden "this" pointer. The trigger code in Outpost 2 won't know the source object to pass. It only has a function address.

Code: [Select]
// C++
object.method();
// Rough equivalent in C
object_method(&object);

The trigger callback won't know what to pass for the hidden parameter.