c – 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 (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))

正如预期的那样完美地工作但是有铿锵声

if (typeid(*(*it)) == typeid(T))

比较显示不同的行为..不确定为什么这个不同.

谢谢

解决方法

对于这样的代码,一个好主意是静态地确保类T是从MsgList派生的.使用boost,可以这样做:

BOOST_STATIC_ASSERT((升压:: is_base_and_derived ::值));

相关文章

对象的传值与返回说起函数,就不免要谈谈函数的参数和返回值...
从实现装饰者模式中思考C++指针和引用的选择最近在看...
关于vtordisp知多少?我相信不少人看到这篇文章,多半是来自...
那些陌生的C++关键字学过程序语言的人相信对关键字并...
命令行下的树形打印最近在处理代码分析问题时,需要将代码的...
虚函数与虚继承寻踪封装、继承、多态是面向对象语言的三大特...