C++ llvm clang编译器上的动态\u强制转换失败
我看到了一个奇怪的故障,C++ llvm clang编译器上的动态\u强制转换失败,c++,compilation,llvm,clang,dynamic-cast,C++,Compilation,Llvm,Clang,Dynamic Cast,我看到了一个奇怪的故障,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
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;
}
如预期般完美工作,但发出叮当声
if (typeid(*(*it)) == typeid(T))
比较显示出不同的行为。。不清楚这到底是为什么不同
感谢诸如此类的代码,一个好主意是静态地确保类T是从MsgList派生的。使用boost,可以这样做:
BOOST_STATIC_ASSERT((BOOST::is_base_and_derived::value)) 这可能是很多事情。您确定两个编译器中的类型相同吗?两个编译器中都有虚方法表吗?两个编译器中是否都启用了RTTI?尝试将问题简化为一个小示例,并将其与使用的编译器命令一起发布。不要将其写在注释中,请编辑问题!应始终在问题正文中添加其他详细信息。这就是为什么它们是可编辑的!尝试在调试消息中打印
typeid(**it)
和typeid(T)
-和typeid(*it)
和typeid(T*)
。同时将动态_cast
移出条件并检查它是否返回NULL
-动态cast在内部执行typeid比较,但也接受子实例。我已经打印了typeid(*it)).name()和typeid(T).name(),两者都是相同的,甚至我在将动态_抛出状态后也进行了检查。我清楚地表明,dynamic_cast只返回NULL。不知道为什么!关于您的信息,还有一点,MsgList将保存msg,它将在运行时使用GSoap构建。我不明白它是如何产生差异的,因为我看到相同的代码在gcc中工作得非常完美。您使用的每个编译器的版本是什么?您使用的是什么平台和平台版本?当你说“比较显示不同的行为”时,那不同的行为是什么?
if (typeid(*(*it)) == typeid(T))