Типичный результат в разных DLL - PullRequest
3 голосов
/ 25 июня 2010

У меня есть два dll, которые оба объявляют шаблонный тип, давайте назовем A. Если объявление A является достаточно сложным, бывает, что результат typeid (A) .name () отличается при вызове в функциях в двух разныхdll's.

пример:

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();
    }

например name1 может выглядеть примерно так: "???MyType ??? etc ", в то время как name2 может быть" ??? A ?? TEMPLATE_LIST_OF_A и т. Д. "чтобы гарантировать, что name1 == name2?

спасибо, грабите

Ответы [ 3 ]

3 голосов
/ 25 июня 2010

Мало того, что нет никакой гарантии, что typeid().name() одинаково в разных DLL, стандарт почти не дает никаких гарантий относительно возвращаемой строки.В частности, не гарантируется, что он будет а) значимым, б) уникальным для разных типов, в) одинаковым для идентичных типов.

Что касается качества реализации, вы, вероятно, можете предположить, что эти три условия выполняются, но особенно для сложных типов шаблонов, я не удивлюсь, если вы найдете случаи, когда они были нарушены в конкретном компиляторе.

Соответствующими частями стандарта 98 являются 5.2.8 и 18.5.1

0 голосов
/ 25 июня 2010

Если две библиотеки DLL скомпилированы с точно с одинаковыми параметрами ОС, компилятора и компилятора, вероятно, что typeid будут одинаковыми.

0 голосов
/ 25 июня 2010

Нет, на самом деле существуют разные типы (на мой взгляд).

Также typeid (). Name () зависит от компилятора.

...