我看到一个奇怪的失败,其中 dynamic_cast
在 clang 编译器上返回 NULL
。但是相同的代码适用于 gcc 环境。
您能指出根本原因是什么吗? llvm 和 gcc 上的 dynamic_cast
之间可能有什么区别。
我正在使用两个编译器的默认行为,我认为默认情况下 RTTI 是启用的。
template<typename T> T*
find_msg_of_type(
MsgList *list
) {
T* msg = NULL;
if (list) {
for (std::vector<MsgList*>::iterator it = list->element.begin();
it != list->element.end();
it++) {// MsgList can be list of objects build with GSoap.
if (typeid(*(*it)) == typeid(T)) {
msg = dynamic_cast<T*>(*it); // Failing on clang but this same code is working with gcc compiler.
break;
}
}
}
return msg;
}
再观察一下:使用 gcc
if (typeid(*(*it)) == typeid(T))
按预期完美工作,但有 clang
if (typeid(*(*it)) == typeid(T))
比较显示出不同的行为。不确定为什么会有所不同。
谢谢
最佳答案
对于这样的代码,一个好主意是静态地确保类 T 派生自 MsgList。使用 boost,可以这样完成:
BOOST_STATIC_ASSERT((boost::is_base_and_derived::value));
关于c++ - llvm clang 编译器上的 dynamic_cast 失败,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14119136/