我看到一个奇怪的失败,其中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 ::值));