basic_string<tchar>...??????



  • hey leute,
    ch wollte eine string klasse schreiben, die die funktionen von basic_string nutzt, und sowohl mit unicode, dbcs und ascii funzt. deshalb habe ich in meiner klasse ein member:
    basic_string<TCHAR> m_String;
    dazu muss ich natürlich string und tchar.h einbinden, tue ich dies, so bekomme ich jedoch hunderte von fehlern... sobald ich string weglasse, sind es nur noch ein paar fehler... hier mal das logfile mit beiden incluidierten dateien:

    Kompilieren...
    Main.cpp
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(17) : error C2039: 'memchr': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(17) : error C2873: 'memchr': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(17) : error C2039: 'memcmp': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(17) : error C2873: 'memcmp': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(18) : error C2039: 'memcpy': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(18) : error C2873: 'memcpy': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(18) : error C2039: 'memmove': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(18) : error C2873: 'memmove': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(18) : error C2039: 'memset': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(18) : error C2873: 'memset': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(19) : error C2039: 'strcat': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(19) : error C2873: 'strcat': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(19) : error C2039: 'strchr': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(19) : error C2873: 'strchr': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(19) : error C2039: 'strcmp': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(19) : error C2873: 'strcmp': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(20) : error C2039: 'strcoll': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(20) : error C2873: 'strcoll': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(20) : error C2039: 'strcpy': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(20) : error C2873: 'strcpy': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(20) : error C2039: 'strcspn': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(20) : error C2873: 'strcspn': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(21) : error C2039: 'strerror': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(21) : error C2873: 'strerror': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(21) : error C2039: 'strlen': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(21) : error C2873: 'strlen': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(21) : error C2039: 'strncat': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(21) : error C2873: 'strncat': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(22) : error C2039: 'strncmp': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(22) : error C2873: 'strncmp': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(22) : error C2039: 'strncpy': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(22) : error C2873: 'strncpy': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(22) : error C2039: 'strpbrk': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(22) : error C2873: 'strpbrk': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(23) : error C2039: 'strrchr': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(23) : error C2873: 'strrchr': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(23) : error C2039: 'strspn': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(23) : error C2873: 'strspn': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(23) : error C2039: 'strstr': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(23) : error C2873: 'strstr': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(24) : error C2039: 'strtok': Ist kein Element von 'operatorglobal namespace''' d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(24) : error C2873: 'strtok': Das Symbol kann nicht in einer using-Deklaration verwendet werden d:\\Microsoft Visual Studio .NET\\Vc7\\include\\cstring(24) : error C2039: 'strxfrm': Ist kein Element von 'operatorglobal namespace'''
    d:\Microsoft Visual Studio .NET\Vc7\include\cstring(24) : error C2873: 'strxfrm': Das Symbol kann nicht in einer using-Deklaration verwendet werden
    d:\Microsoft Visual Studio .NET\Vc7\include\new(57) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'operator delete'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(57): Siehe Deklaration von 'operator delete'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(58) : error C2732: Bindungsangaben widersprechen vorheriger Angabe für 'operator new'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(58): Siehe Deklaration von 'operator new'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(84) : error C2733: Zweite C-Bindung für überladene Funktion 'operator delete[]' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(84): Siehe Deklaration von 'operator delete[]'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(87) : error C2733: Zweite C-Bindung für überladene Funktion 'operator new[]' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(86): Siehe Deklaration von 'operator new[]'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(92) : error C2733: Zweite C-Bindung für überladene Funktion 'operator new' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(91): Siehe Deklaration von 'operator new'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(95) : error C2733: Zweite C-Bindung für überladene Funktion 'operator new[]' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(94): Siehe Deklaration von 'operator new[]'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(98) : error C2733: Zweite C-Bindung für überladene Funktion 'operator delete' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(97): Siehe Deklaration von 'operator delete'
    d:\Microsoft Visual Studio .NET\Vc7\include\new(101) : error C2733: Zweite C-Bindung für überladene Funktion 'operator delete[]' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\new(100): Siehe Deklaration von 'operator delete[]'
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(29) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(112) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(124) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(233) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(320) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(406) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(409) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(412) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(415) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(418) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(421) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(424) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(427) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(430) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(434) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(438) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(442) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(446) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(449) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(452) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\iosfwd(455) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(12) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(20) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(55) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(63) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(71) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(80) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(88) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(96) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(104) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(109) : warning C4190: 'make_pair' hat C-Bindung angegeben, aber gibt UDT 'std::pair<_Ty1,_Ty2>' zurück, was mit C inkompatibel ist
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(111) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(116) : error C2733: Zweite C-Bindung für überladene Funktion 'std::swap' nicht zulässig
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(113): Siehe Deklaration von 'std::swap'
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(121) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(127) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(133) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\utility(139) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(53) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(68) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(78) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(95) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(106) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(117) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(128) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(133) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(138) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(143) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(155) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(160) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(165) : error C2894: Vorlagen können nicht mit 'C'-Bindung deklariert werden
    d:\Microsoft Visual Studio .NET\Vc7\include\xutility(165) : fatal error C1003: Mehr als 100 Fehler gefunden; Kompilierung wird abgebrochen.

    sorry, ist sehr lang, hoffe mir kann trotzdem jemand helfen... danke schonmal



  • Es gibt doch bereits die Klasse wstring.
    basic_string<wchar_t, char_traits<wchar_t>, allocator<wchar_t> >
    Das reicht doch für alles aus.



  • Nein reicht sie nicht, weil TCHAR nicht immer == wchar_t ist. Bei mir funktioniert basic_string<TCHAR> allerdings wunderbar.

    Benützt du eine eigene String-Klasse? Mich wundern diese ganzen "Funktion nicht gefunden"-Fehler.

    MfG SideWinder



  • Eben getestet(vs.net so wie du), habe zuerst den string header inkludiert anschließend den tchar.h und konnte ohne Probleme nen basic_string<TCHAR> benutzen.

    Edit:
    Kann es sein, dass diese Fehler überall dort sind wo du Funktionen aus der STL benutzt (welche ja keine Implementierung für TCHAR haben, je nach Typ)?



  • @SideWinder: jope, is ne eigene klasse, und mich wundern diese fehler auch 😉
    @SirLant: ich benutrze ja keine funktionen aus der stl, alles, was ich bis jetzt habe ist die deklaration meiner klasse. und selbst die besteht nur aus einem "protected member" basic_string<TCHAR> m_String...
    danke schonmal für die antworten
    hilfeee



  • wozu TCHAR? das ist doch nur die Abfrage, ob UNICODE definiert ist. wenn ja dann wchar_t, ansonsten char. das kann man mit string und wstring auch über typedef.



  • Das saugt aber, die Standardtypedefs unintuitiv zu verändern. Die Idee mit TCHAR ist prinzipiell nicht schlecht.
    Allerdings würde ich es noch sinnvoller finden, einfach immer Unicode zu verwenden.



  • Optimizer schrieb:

    Das saugt aber, die Standardtypedefs unintuitiv zu verändern.

    Wie schon vorgeschlagen, würde ich eher sowas machen:

    #ifdef UNICODE
    typedef std::wstring string;
    #else
    typedef std::string string;
    //bzw.
    using std::string;
    #endif
    

    Verändert wird hier gar nichts, es wird lediglich ein Synonym im aktuellen Namensbereich erzeugt.



  • sag ich doch! 😉 😃



  • Die ersten paar Fehler kann ich eliminieren. Wenns eine eigene String-Klasse ist verwendest du offenbar strlen(), strcpy(), etc. in der Implementierung. Das geht aber mit wchar_t nicht mehr.

    Die "dynamischen" Funktionen heißen: _tcslen(), _tcscpy(), etc. und sind ebenfalls in der <tchar.h> deklariert. Schau mal was dann noch übrigbleibt.

    MfG SideWinder



  • @SideWinder: wie gesagt, ich habe bis jetzt noch keine implementierung... ich habe jhetzt den gesamten code nochmal gelöscht, und merkwürdigerweise findet der compiler immer nioch nicht memcmp und memset...
    ich weuß echt nicht, was ich tun soll... hilfee 😞



  • HAHA, hab den fehler gefunden, es lag daran, dass mein String header ("String.h") den gleichen namen wie string.h hatte (logisch ;-)), und das fat32 system nicht case intensive ist... sorry, hab nochmal gegooglet und eine erklärung gefunden, die ich nur halb verstanden hab... aber jetz gez, danke trotzdem an alle
    cya



  • wenn du #include <string.h> und #include "String.h" schreibst sollte es aber gehen



  • Das kommt davon, wenn man <string.h> anstatt <string> inkludiert.



  • ich hatte ja string und nicht string.h, aber in windows.h beziehungsweise ein header, der von dieser includiert wird, bindet string.h ein.


Log in to reply