c ++ filt ne démêle pas le nom du typeid

J’exécute un code sur le compilateur GCC C ++ , pour sortir le type_info :: name:

#include  #include  using namespace std; class shape { protected: int color; public: virtual void draw() = 0; }; class Circle: public shape { protected: int color; public: Circle(int a = 0): color(a) {}; void draw(); }; void Circle::draw() { cout<<"color: "<<color<<'\n'; } class triangle: public shape { protected: int color; public: triangle(int a = 0): color(a) {}; void draw(); }; void triangle::draw() { cout<<"color: "<<color<<'\n'; } int main() { Circle* a; triangle* b; cout<<typeid(a).name()<<'\n'; cout<<typeid(b).name()<<'\n'; } 

mais j’obtiens les résultats suivants:

 P6Circle P8sortingangle 

et sur démêler,

 ./shape | c++filt 

Je reçois le même résultat que précédemment. Une autre solution?

Vous devez utiliser c++filt -t pour les types afin que les éléments suivants fonctionnent:

 ./shape | c++filt -t 

la page de manuel pour c ++ filt dit ce qui suit pour -t :

Essayez de démêler les types ainsi que les noms de fonction. Cette option est désactivée par défaut car les types mutilés ne sont généralement utilisés qu’en interne dans le compilateur et peuvent être confondus avec des noms non mutilés. Par exemple, une fonction appelée “a” traitée comme un nom de type mutilé serait démêlée en “caractère signé”.

Quelle version de GCC (et de sa libstdc ++ correspondante) utilisez-vous?

Avec GCC 4.8, j’ai

 static inline std::ssortingng demangled_type_info_name(const std::type_info&ti) { int status = 0; return abi::__cxa_demangle(ti.name(),0,0,&status); } 

et puis je peux utiliser

 std::cout << demangled_type_info_name(typeid(*ptr)) << std::endl; 

ptr pointe sur un object avec un RTTI (c'est-à-dire avec des méthodes virtuelles, notamment un destructeur virtuel).