2010-06-25 2 views
3

J'ai deux dll qui déclarent tous deux un type de modèle, appelons A. Si la déclaration de A est suffisamment complexe, il arrive que le résultat de typeid (A) .name() est différent lorsqu'il est appelé dans les fonctions dans deux dll différents.résultat de typeid à travers différentes DLLs

exemple:

DLL1:

struct MyType: public A<TEMPLATE_LIST_OF_A>{} 

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

DLL2:

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

par exemple nom1 pourrait être quelque chose comme: "??? ??? MyType etc" tout nom2 pourrait être "??? A TEMPLATE_LIST_OF_A etc".

Ce qui me fait vraiment sens, mais y a-t-il un moyen, à condition que les noms utilisés soient le samem pour garantir que name1 == name2?

merci, Rob

Répondre

3

Non seulement il n'y a aucun moyen de garantir que typeid().name() est le même dans différentes DLL, mais la norme ne garantit pratiquement pas la chaîne retournée. Spécifiquement, il n'est pas garanti d'être a) significatif, b) unique pour différents types, c) le même pour des types identiques. En tant que problème de qualité d'implémentation, vous pouvez probablement supposer que ces trois conditions sont valides, mais en particulier pour les types de modèles compliqués, je ne serais pas surpris si vous pouviez trouver des cas où ils ont été violés dans un compilateur spécifique.

Les parties pertinentes de la norme 98 sont 5.2.8 et 18.5.1

+0

merci, il est juste le pire des cas que je craignais! – rob

0

Nope, il existe en fait différents types (à mon avis).

De même typeid(). Nom() est spécifique au compilateur.

0

Si les deux DLL sont compilés avec exactement les mêmes options du système d'exploitation, du compilateur et du compilateur, il semble probable que les types seront les mêmes.

Questions connexes