Reputation: 321
I'm creating some data structures here (with MFC), compiling in MS Visual C++ 6.0 (yes, it's old).
struct SOpcodeData
{
BYTE m_byDataType;
DWORD m_dwMinValue;
DWORD m_dwMaxValue;
WORD m_wRepeat;
};
const BYTE DATA_U8 = 0;
const BYTE DATA_U16 = 1;
const BYTE DATA_U32 = 2;
SOpcodeData MY_BYTE = { DATA_U8, 0, UCHAR_MAX, 1 };
SOpcodeData MY_WORD = { DATA_U16, 0, USHRT_MAX, 1 };
SOpcodeData MY_DWORD = { DATA_U32, 0, UINT_MAX, 1 };
This code compiles with no errors or warnings. But when I try to create an array of my struct type...
SOpcodeData foo[] = { MY_BYTE, MY_BYTE, MY_WORD, MY_DWORD, MY_BYTE };
VC6 pops a compilation error for each array element:
device.cpp(78) : error C2440: 'initializing' : cannot convert from 'struct SOpcodeData' to 'unsigned char'
No user-defined-conversion operator available that can perform this conversion, or the operator cannot be called
Aparently it is mistaking the whole struct type with the first struct field, which is a BYTE (or unsigned char for those who are not used to MFC).
Tried it on Visual Studio 2010 and it works perfectly. But I need to build it using VC6.
I've tried to explicit cast to struct type inside array initialization, but that's redundant and does not solved anything. Any other ideas?
Upvotes: 4
Views: 1128
Reputation: 321
We've figured out another solution, without using #define
: using a constructor to initialize the data structures. Sorta like this:
struct SOpcodeData
{
SOpcodeData (const BYTE byDataType, const DWORD dwMinValue, const DWORD dwMaxValue, const WORD wRepeat)
: m_byDataType(byDataType), m_dwMinValue(dwMinValue), m_dwMaxValue(dwMaxValue), m_wRepeat(wRepeat)
{}
BYTE m_byDataType;
DWORD m_dwMinValue;
DWORD m_dwMaxValue;
WORD m_wRepeat;
};
SOpcodeData MY_BYTE (DATA_U8, 0, UCHAR_MAX, 1);
SOpcodeData MY_WORD (DATA_U16, 0, USHRT_MAX, 1);
SOpcodeData MY_DWORD (DATA_U32, 0, UINT_MAX, 1);
SOpcodeData foo[] = { MY_BYTE, MY_WORD, MY_DWORD };
Thanks to everyone!
Upvotes: 0
Reputation: 283634
Since you insist on using a compiler with lots and lots of known bugs, you will need an ugly workaround:
#define MY_BYTE_CONTENT { DATA_U8, 0, UCHAR_MAX, 1 }
#define MY_WORD_CONTENT { DATA_U16, 0, USHRT_MAX, 1 }
#define MY_DWORD_CONTENT { DATA_U32, 0, UINT_MAX, 1 }
SOpcodeData MY_BYTE = MY_BYTE_CONTENT;
SOpcodeData MY_WORD = MY_WORD_CONTENT;
SOpcodeData MY_DWORD = MY_DWORD_CONTENT;
SOpcodeData foo[] = { MY_BYTE_CONTENT, MY_BYTE_CONTENT, MY_WORD_CONTENT, MY_DWORD_CONTENT, MY_BYTE_CONTENT };
Upvotes: 4