结构数组 - 初始化错误

时间:2012-07-19 12:57:23

标签: c++ vc6

我在这里创建一些数据结构(使用MFC),在MS Visual C ++ 6.0中编译(是的,它已经过时了)。

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 };

此代码编译时没有错误或警告。但是当我尝试创建一个结构类型的数组时......

SOpcodeData foo[] = { MY_BYTE, MY_BYTE, MY_WORD, MY_DWORD, MY_BYTE };

VC6为每个数组元素弹出一个编译错误:

  

device.cpp(78):错误C2440:'初始化':无法从'struct SOpcodeData'转换为'unsigned char'

     

没有可用于执行此转换的用户定义转换运算符,或者无法调用运算符

通常它将整个结构类型误认为是第一个结构字段,它是BYTE(对于那些不习惯MFC的人来说是unsigned char)。

在Visual Studio 2010上尝试过,它运行得很好。但我需要使用VC6构建它。

我试图在数组初始化中显式转换为struct类型,但这是多余的,并没有解决任何问题。还有其他想法吗?

2 个答案:

答案 0 :(得分:4)

由于您坚持使用包含大量已知错误的编译器,因此您需要一个丑陋的解决方法:

#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 };

答案 1 :(得分:0)

我们已经找到了另一个解决方案,没有使用#define:使用构造函数来初始化数据结构。像这样排序:

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 };

感谢大家!