C++ 跨不同dll的typeid结果';s

C++ 跨不同dll的typeid结果';s,c++,dll,templates,typeid,C++,Dll,Templates,Typeid,我有两个DLL,它们都声明了一个模板类型,让我们调用一个。 如果A的声明足够复杂,那么 在两个不同的函数中调用typeid(A).name()的结果是不同的 dll的 例如: DLL1: struct MyType:public A{} void f(){ std::string name1=typeid(A).name(); } DLL2: struct MyType:public A{} void f(){ std::string name2=typeid(A).name(); } 例如

我有两个DLL,它们都声明了一个模板类型,让我们调用一个。 如果A的声明足够复杂,那么 在两个不同的函数中调用typeid(A).name()的结果是不同的 dll的

例如:

DLL1:

struct MyType:public A{}
void f(){
std::string name1=typeid(A).name();
}
DLL2:

struct MyType:public A{}
void f(){
std::string name2=typeid(A).name();
}
例如,name1可能类似于:“???MyType???等” 而名称2可以是“模板、列表等”

这对我来说很有意义,但是如果 使用的名称是samem,以保证name1==name2

谢谢,
rob

不,实际上有不同的类型(在我看来)


另外,typeid().name()是编译器特定的。

如果两个DLL使用完全相同的操作系统、编译器和编译器选项编译,那么typeid很可能是相同的。

不仅无法保证
typeid().name()在不同的DLL中是相同的,标准对返回的字符串几乎没有任何保证。具体来说,它不能保证a)有意义,b)对于不同类型是唯一的,c)对于相同类型是相同的

作为一个实现质量问题,您可能会假设这三个条件成立,但特别是对于复杂的模板类型,如果您能在特定的编译器中发现违反这些条件的情况,我不会感到惊讶

98标准的相关部分为5.2.8和18.5.1

struct MyType: public A< TEMPLATE_LIST_OF_A >{}

void f(){
std::string name1 = typeid(A).name();
}
struct MyType: public A< TEMPLATE_LIST_OF_A >{}
    void f(){
    std::string name2 = typeid(A).name();
    }