【发布时间】:2017-11-12 18:12:37
【问题描述】:
我在使用 LLVM 编译以下函数时遇到问题,该函数在 MSVC 中编译得非常好。
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"
我环顾四周,建议执行以下操作-
return const_cast<Fn>(reinterpret_cast<const Fn>(vtable[index]));
这导致了同样的问题。
任何帮助将不胜感激!
【问题讨论】:
-
你做一个
const_cast<void*>(instance)。这个错误你怎么不清楚? -
否则,从 'const void *' 到 'const void ***' 的 reinterpret_cast 错误会丢弃限定符。代码前面的基本相同的问题。原来的错误发生在最后一行。
-
“导致了同样的问题”——这是不可能的。向我们展示第二种情况的错误。
-
我做到了,再次阅读我的消息。 " reinterpret_cast 从 'const void *' 到 'const void ***' 抛弃限定符" 代码: const auto vtable = *reinterpret_cast
(instance); -
const auto vtable = *reinterpret_cast<const void***>(const_cast<void*>(instance));你认为vtable在这行之后应该是什么?
标签: c++ templates casting llvm void-pointers