Important changes to forums and questions
All forums and questions are now archived. To start a new conversation or read the latest updates go to forums.mbed.com.
9 years, 4 months ago.
Try to put a class instance into a union - works with GCC but not with mbed
Hello,
I kindly ask for help with a syntax error. I wrote a union declaration:
union declaration containing a class instance
typedef union uTelemetryDataValue { float f; q1516_t q; int32_t i; uint32_t u; uTelemetryDataValue() { q= q1516_t(0); } } tdValue_t;
...and the type q1516_t is a class (you'll guess it) for a fixed point data format:
class declaration of the instance in question
class q1516 { private: int32_t v; public: int32_t getv() { return (v); } ... q1516() { v=0; } q1516(const int opnd) { if (opnd>=32768 || opnd<-32768) throw_(q_rangeviolation); v= INT2Q1516(opnd); } int16_t toInt() { return (int16_t)(v>0? (v)>>16 : ((v)>>16)+1); } int16_t rndInt(); char* toString(); char* toString(char *dst, const int before, const int after); q1516 operator=(const q1516& q) { v=q.v; return (*this);} q1516 operator=(const int i); friend q1516 operator+(const q1516& left, const q1516& right); friend q1516 operator+(const q1516& left, const int right); friend q1516 operator+(const int left, const q1516& right); ... } typedef q1516 q1516_t;
...and quite a lot of other operator methods and friend operator routines.
I already have tested q1516 on a PC using GCC and in mbed on a NUCLEO and it worked. I already have compiled and tested the union on a PC using GCC and it worked. Now, within mbed, I get a syntax error message
Invalid union member - class "q1516" has disallowed member function followed by the source line "q1516_t q;".
The Help button doesn't yield a help page, just a "not found" message. I never have heard from such a problem and do not khow what to do.
Thank you in advance, sincerely
Helmut Stettmaier
Question relating to:
1 Answer
9 years, 4 months ago.
A google resulted:
Quote:
A union can have member functions (including constructors and destructors), but not virtual functions. A union shall not have base classes. A union shall not be used as a base class. An object of a class with a non-trivial constructor, a non-trivial copy-constructor, a non-trivial destructor, or a non-trivial copy assignment operator cannot be a member of a union, nor can an array of such objects. If a union contains a static data member, or a member of a reference type, the program is ill-formed.
For what is non-trivial, see this explanation: http://stackoverflow.com/questions/3899223/what-is-a-non-trivial-constructor-in-c
The TL;DR is: Everything you write yourself is non-trivial. So if I am not mistaken, according to the C++ standard your construction is not allowed. Not every compiler follows the standard exactly, so GCC does allow it, and Keil (the mbed compiler) apparantly follows it stricter.