我看到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))
正如预期的那样完美地工作但是有了clang
if (typeid(*(*it)) == typeid(T))
比较显示出不同的行为..不确定为什么会有这种不同。
由于
答案 0 :(得分:0)
对于这样的代码,一个好主意是静态地确保类T是从MsgList派生的。使用boost,可以这样做:
BOOST_STATIC_ASSERT((升压:: is_base_and_derived ::值));