Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ llvm clang编译器上的动态\u强制转换失败_C++_Compilation_Llvm_Clang_Dynamic Cast - Fatal编程技术网

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))