2012-07-19 101 views
4

我在這裏(用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:初始化':不能轉換從‘結構SOpcodeData’到‘無符號字符’

無可用的能夠執行這種轉換,或操作員不能被稱爲用戶定義的轉換運算符

Aparently它錯誤地將整個結構類型與第一個結構字段(對於不用於MFC的用戶)的字節(或無符號字符)錯誤結合。

在Visual Studio 2010上嘗試過它,它完美地工作。但我需要使用VC6來構建它。

我試圖顯式強制轉換爲數組初始化內部的結構類型,但這是多餘的,並沒有解決任何問題。任何其他想法?

回答

0

我們已經想出了另一種解決方案,而無需使用#define:使用構造函數初始化數據結構。 Sorta像這樣:

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

感謝大家!

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

謝謝!它解決了。完美編譯。 :-) 就我個人而言,我不會在VC6上編譯,但我必須。問候! – Taschetto 2012-07-19 14:20:17

+0

該解決方法應該是有效的,但我不認爲這是一個bug - 數組初始化列表通常不接受其他變量來初始化數組元素,除了可能的內置類型(這可能只是一個常見的擴展 - 我不記得標準要說些什麼,所以我可能會誤解)。 – twalberg 2012-07-19 14:21:03

+0

我也不瞭解標準,但是使用非內置類型的數組初始化在Visual Studio 2010中工作得很好。 – Taschetto 2012-07-19 14:44:12