Hallo,
Ich habe ein Problem mit dem rtti feature unter Windows.
Ich habe Qt mit dem Intel C++ 8.1 kompiliert mit den folgenden Kommandos (Man sieht, daß rtti durch -GR angeschaltet ist!):
icl -c -nologo -Zm200 -W3 -MD -GX -GX -GR -DUNICODE -DQT_DLL
-DQT_THREAD_SUPPORT -DQT_NO_DEBUG -I"C:\Qt\3.3.4\include" -I"."
-I"tmp\moc\release_mt_shared" -I"C:\Qt\3.3.4\mkspecs\win32-icc"
-Fotmp\obj\release_mt_shared\ @C:\DOKUME~1\user\LOKALE~1\Temp\nm84.tmp
main.cpp
link /NOLOGO delayimp.lib /DELAYLOAD:comdlg32.dll
/DELAYLOAD:oleaut32.dll /DELAYLOAD:winmm.dll /DELAYLOAD:wsock32.dll
/DELAYLOAD:winspool.dll /DELAYLOAD:opengl32.dll /SUBSYSTEM:windows
/LIBPATH:"C:\Qt\3.3.4\lib" /OUT:aclock.exe
@C:\DOKUME~1\user\LOKALE~1\Temp\nm85.tmp
Die Bibliothek und das Beispiel aclock funktionieren einwandfrei.
Nun habe ich folgende Zeilen hinzugefügt, die RTTI benutzen:
QRadioButton *button = new QRadioButton(0,"TestButton");
char name[1024];
sprintf( name, "\"%s\" \"%s\" (\"%s\")",
button->name(), button->className(),
typeid( *button ).name() );
clock->setCaption(name);
Der Aufruf typeid(*button) failed mit der folgenden Nachricht:
"Runtime Error!
..
This application has requested the Runtime to terminate it in an unusual
way. Please contact the application's support for more information."
Visual Studio liefert eine non_rtti_object exception. Die Aufrufe typeid(button) und typeid(*clock) dagegen arbeiten korrekt!
Was habe ich falsch gemacht? Kann mir jemand bitte helfen?
Danke im Vorraus,
Gil
typeid mit Qt Objekten wirft eine exception
Das Problem entsteht auch wirklich nur unter Windows. Unter Linux habe ich den Fehler nicht!
Ich will eigentlich auch dynamic_cast<QRadioButton*>(button) benutzen. Das wiederum benutzt allerdings typeid(*button) oder zumindest die gleiche Funktionalität und führt damit zur Exception.
Lepsai, kommst Du dazu, das mal so bei Dir auszuprobieren?
Danke, Gil
Ich will eigentlich auch dynamic_cast<QRadioButton*>(button) benutzen. Das wiederum benutzt allerdings typeid(*button) oder zumindest die gleiche Funktionalität und führt damit zur Exception.
Lepsai, kommst Du dazu, das mal so bei Dir auszuprobieren?
Danke, Gil
Also bei mir kein Problem bei folgendem Code:
QPushButton * tt = new QPushButton(&plot);
QString str = typeid(*tt).name();
Ich hab allerdings grade keinen intel.Com. installiert. ansonsten VC 6.0 SP 6, Qt 3.3.4, Microsoft Plattform SDK 2003, In VS 6 in Project Settings-> C++-> C++ Language-> Enalbe RTTI - enabled und Enable Exception handling - enabled...
Läuft ohne Probleme...
QPushButton * tt = new QPushButton(&plot);
QString str = typeid(*tt).name();
Ich hab allerdings grade keinen intel.Com. installiert. ansonsten VC 6.0 SP 6, Qt 3.3.4, Microsoft Plattform SDK 2003, In VS 6 in Project Settings-> C++-> C++ Language-> Enalbe RTTI - enabled und Enable Exception handling - enabled...
Läuft ohne Probleme...