function TestOutBool(out bool Bool);編譯器會回報"Booleans may not be out parameters"。
這是因為布林變數實作上其實只是個bitfield,在編譯時同一個類別的布林屬性會湊在一起,儘量減少總共需要的大小。然而如果把上述宣告為原生函式,要產生C++標頭檔時,會遇到無法在C++中表示reference to bitfield的問題。雖然可以為這種情況作特殊處理,不過其實只要改為宣告為out byte就可以解決了。
然而宣告使用out array<bool>參數的函式會遇到編譯器回報同樣的錯誤:
function TestOutBoolArray(out array<bool> Array);這其實是編譯器的誤判,在語法剖析後token會轉為對應的UProperty來保存相關的屬性資訊,然而在轉換後布林陣列的token會失去陣列資訊而變成跟布林的token一樣。剛好out參數的檢查是在這之後執行,所以才造成這個問題。
其實只要在檢查時順便確認轉換後的UProperty是不是UArrayProperty就可以避免這個情形了:
else if( Property.Type==CPT_Bool && (Property.PropertyFlags & CPF_OutParm) && !Prop->IsA(UArrayProperty::StaticClass()) ) { ScriptErrorf(SCEL_Restricted, TEXT("Booleans may not be out parameters") ); }
沒有留言:
張貼留言