2017-11-12 21 views
0

MSVCで完全にコンパイルされたLLVMで以下の関数をコンパイルする際に問題があります。const void *からLLVMのテンプレートタイプへのキャスト問題がある

template<typename Fn> 
Fn GetVFunction(const void *instance, std::size_t index) { 
    const auto vtable = *reinterpret_cast<const void***>(const_cast<void*>(instance)); 
    return reinterpret_cast<Fn>(vtable[index]); 
} 

次のエラーが起こる:

"reinterpret_cast from 'const void *' to 'SDK::UObject *(*)(SDK::UClass *)' casts away qualifiers" 

は、私の周りを見て、それは同じ問題が生じたfollowing-

return const_cast<Fn>(reinterpret_cast<const Fn>(vtable[index])); 

を行うことが示唆されました。

助けていただけたら幸いです!

+2

あなたは 'const_cast (インスタンス)'を実行します。どのようにこのエラーがあなたにはっきりしていないのですか? – StoryTeller

+0

reinterpret_castを 'const void *'から 'const void ***'に変更すると、修飾子がキャストされなくなります。基本的に同じ問題がコードのすぐ前にあります。元のエラーは最終行で発生しました。 – TJ8

+0

"*これは同じ問題を引き起こした*" - それは不可能です。その2番目のケースでエラーを表示してください。 – rustyx

答えて

1

問題は、テンプレートinstantinationで発生したとして、あなたのエラーは何も再現可能ではありませんが、私は次のようにvoid*操作は通常、Cの貧しいコーディングの兆候であることを

template<typename Fn> 
Fn GetVFunction(const void *instance, std::size_t index) { 
    auto vtable = reinterpret_cast<void**>(const_cast<void*>(instance)); 
    return reinterpret_cast<Fn>(vtable[index]); 
} 

注動作するはずと思うだろう++(そのため、エラーが発生しやすいですが、Cでは共通です(タイプセーフな汎用プログラミングに欠けています)

+0

インスタンスを参照解除して\ * reinterpret_cast に変更する必要があります働いた。 解決策を試した後にエラーが表示されるようになりました。私は、LLVMはconst void *へのreinterpret_castをやっているのが好きではないと思うし、この場合は必要ではなかった。 – TJ8

+0

@ TJ8まだ元のエラーを理解していないようです。 LLVMは、第2の 'reinterpret_cast'について、' const'から非コンステートへキャストしようとしたときに苦情を言いました。そのMSVCはこれがバグであることを可能にします。 – Walter

関連する問題