C++ 当从DLL调用时,typeid不返回派生类

C++ 当从DLL调用时,typeid不返回派生类,c++,templates,dll,polymorphism,typeid,C++,Templates,Dll,Polymorphism,Typeid,我正在使用typeid为我的应用程序生成调试输出。我依赖于typeid对基类的去引用指针的多态行为 现在我遇到了一个问题,要么是一个编译器错误,要么是一些奇怪的类型推断规则,乍一看并不明显 我有一个使用模板参数的公共基类,该参数在公共头文件中定义: class Type {}; template<typename T> class Base { virtual void dummy() {} }; 类类型{}; 模板类基类{virtual void dummy(){}; 然后我

我正在使用
typeid
为我的应用程序生成调试输出。我依赖于
typeid
对基类的去引用指针的多态行为

现在我遇到了一个问题,要么是一个编译器错误,要么是一些奇怪的类型推断规则,乍一看并不明显

我有一个使用模板参数的公共基类,该参数在公共头文件中定义:

class Type {};
template<typename T>  class Base { virtual void dummy() {} };
类类型{};
模板类基类{virtual void dummy(){};
然后我有两个DLL:

  • 包含
    Base
    的派生类及其实例的类

    #include "commonheader.h"
    
    class Derived : public Base<Type> { };
    Derived instance;
    main() { CallDLL(&instance); }
    
    #包括“commonheader.h”
    派生类:公共基{};
    派生实例;
    main(){CallDLL(&instance);}
    
  • 还有一个功能是使用指向
    Base
    的指针。使用第一个DLL中实例的地址调用此函数

    #include "commonheader.h"
    
    void CallDLL(Base<Type>* b_ptr)
    {
        std::string typeName1 = typeid(*b_ptr).name();
        std::string typeName2 = typeid(*&*b_ptr).name();
    }
    
    #包括“commonheader.h”
    void CallDLL(基本*b_ptr)
    {
    std::string typeName1=typeid(*b_ptr).name();
    std::string typeName2=typeid(*&*b_ptr).name();
    }
    
据我所知,
typeName1
应计算为
“类派生”
,因为
*b_ptr
是指向多态基类的未引用指针。然而,事实并非如此。结果是
“类基”
。 最令人惊讶的是,当添加另一层间接寻址时,
typeName2
实际上是
“类派生的”

所以这里的主要问题是
typeid(*b_ptr)!=typeid(*&*b_ptr)
,这永远不会发生。

如您所见,第二个版本解决了我最初的问题,即为
b_ptr
所指向的最派生类获取调试输出名称。但我无法解释原因,我想知道这是否是我的预期行为

还有几点意见:

  • 我正在使用VisualStudio2010。我还没有测试其他编译器
  • 无法进一步简化问题:
    • 派生的
      的定义放在标题中会生成正确的输出
    • 将所有内容放在一个DLL(或EXE)中可以生成正确的输出
    • Base
      中删除模板参数将生成正确的输出
谢谢你的帮助