7

我看到一个奇怪的失败,它dynamic_cast正在返回NULLclang 编译器。但是相同的代码适用于 gcc 环境。

你能指出我可能是什么根本原因吗?dynamic_caston llvm 和 gcc之间可能有什么区别。

我正在使用两个编译器的默认行为,我认为默认情况下启用 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))

比较显示不同的行为..不确定为什么会有所不同。

谢谢

4

1 回答 1

0

对于这样的代码,一个好主意是静态确保类 T 派生自 MsgList。使用 boost,可以这样完成:

BOOST_STATIC_ASSERT((boost::is_base_and_derived::value));

于 2013-01-11T18:14:25.963 回答