7

clang コンパイラーでdynamic_castが返されるという奇妙な失敗が見られます。NULLしかし、同じコードが gcc 環境で動作しています。

根本的な原因は何か教えてください。dynamic_castllvm と 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;
}

もう1つの観察:gccを使用

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

期待どおりに完全に機能していますが、clangでは

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

比較は異なる動作を示しています..なぜこれが異なるのか正確にはわかりません。

ありがとう

4

1 に答える 1

0

このようなコードの場合、クラスTがMsgListから派生していることを静的に確認することをお勧めします。ブーストを使用すると、これは次のように実行できます。

BOOST_STATIC_ASSERT((boost :: is_base_and_duced :: value));

于 2013-01-11T18:14:25.963 に答える