2014-10-12 35 views
-6

來自第三方的代碼庫,我得到錯誤:非常令人不安的錯誤信息

錯誤140錯誤:一個指向綁定功能僅可用於調用函數

功能造成的錯誤:

/** Static name of function to call */ 
    static FName GetAddComponentFunctionName() 
    { 
     static const FName AddComponentFunctionName(GET_FUNCTION_NAME_CHECKED(AActor, AddComponent)); 
     return AddComponentFunctionName; 
    } 


// Returns FName(TEXT("FunctionName")), while statically verifying that the function exists in ClassName 
// &((ClassName*)0)->FunctionName will generate 'error: cannot create a non-constant pointer to member function' on the Mac 
#if PLATFORM_WINDOWS 
    #define GET_FUNCTION_NAME_CHECKED(ClassName, FunctionName) \ 
     ((void)sizeof(&((ClassName*)0)->FunctionName), FName(TEXT(#FunctionName))) 
#else 
    #define GET_FUNCTION_NAME_CHECKED(ClassName, FunctionName) \ 
     FName(TEXT(#FunctionName)) 
#endif 

再次,這個代碼編譯與VS,但與英特爾的ICL

回答

3

MyObject->MyFunc ,正如錯誤所述,除了立即函數調用之外,不能用於其他任何內容。即使有些編譯器允許,你甚至不能使用其sizeof。我想你的意思是sizeof(&ClassName::FunctionName)。這很簡單,實際上會編譯,並且不會調用未定義的行爲(取消引用空指針就是UB,即使您對解除引用的結果不做任何處理)。

+0

*「解除引用空指針是UB」*不一定正確,請參閱http://www.open-std.org/jtc1/sc22/wg21/docs/cwg_active.html#232 – dyp 2014-10-12 13:46:36

+0

@Sneftel,嗨,我提供的代碼只是複製和粘貼。謝謝您的回答。我是否正確理解你,因爲你建議將宏擴展更改爲sizeof(&ClassName :: FunctionName)?謝謝 – 2014-10-12 13:51:49

+0

@Thereisnothingwecando這應該可以,是的。或者,您可以無條件地使用第二個'GET_FUNCTION_NAME_CHECKED'實現。第一個版本是提供錯誤檢查,而不是額外的功能。 – Sneftel 2014-10-12 13:55:54