C ++可以使type_info :: hash_code对于两个(据称)相同的对象

时间:2015-06-10 22:43:08

标签: c++ qt hashcode dynamic-cast typeinfo

在尝试调试不成功的动态向下转换之后,我最终发现原因可能是:type_info :: hash_code对于它所转换的类型是不一样的,这取决于它被调用的代码中的位置。 type_info :: name保持完全相同。 不幸的是,我无法在一个最小的例子中重现这种行为,因为它出现在一个非常纠结的环境中。因此,我基本上寻找可能导致此类行为的原因的线索,以及我可以采取的解决方法。

简而言之,如果相关,类型看起来像这样(EDITED):

class A {...}

template < template <class> class>
class B : virtual public A {...}

template < template <class> class>
class C : virtual public A {...}

template < template <class> class>
class D : public B, public C {...}

template <class>
class E {...}

问题看起来像这样:

D<E>* d = build_d();    
B<E>* b = d; 
A* a = d;     

dynamic_cast<D<E>*>(b);//returns correct pointer
dynamic_cast<D<E>*>(a);//returns 0, and really shouldn't !!

typeid(B<E>).hash_code();//differing depending where in the code this is called

对type_info :: hash_code的调用是在不同的库(我自己的)中完成的。在挖掘之后,我发现了关于GCC的编译器选项-rdynamic(即使我使用了Clang)。我不确定它是否与我的问题有任何关系。

编辑:我最终找到了一个很好的线索。遗憾的是还没有解决方案。看来这个问题最终可能与Qt有关。

问题出现在插槽功能中。当信号调用插槽时,dynamic_cast向下转发失败。但是如果我手动调用插槽(例如在main中),它就会成功。如果手动调用插槽,然后通过信号触发它,它也会成功。 信号没有任何争论,并且插槽的内容已被中和&#34;并且不依赖于任何参数。 99,99%肯定问题不是由于分配的算法错误。

看起来像qt_static_metacall,在调用插槽时,不知何故失去了转换属性的轨迹。事实上,预编译的关联moc可能与此有关吗?

0 个答案:

没有答案