ungewolltes Überladen von Operatoren führt zu Fehler



  • Der folgende Codeausschnitt

    m_strInputText = m_strInputText + nChar;
    

    führt zu folgendem Fehler

    y:\cpp\2006\mfclearn\visualkb\visualkb\visualkb.cpp(271) : error C2666: 'ATL::CStringT<BaseType,StringTraits>::operator +': 3 Überladungen haben ähnliche Konvertierungen
            with
            [
                BaseType=wchar_t,
                StringTraits=StrTraitMFC_DLL<wchar_t>
            ]
            c:\programme\microsoft visual studio 8\vc\atlmfc\include\cstringt.h(2326): kann 'ATL::CStringT<BaseType,StringTraits> ATL::CStringT<BaseType,StringTraits>::operator +(const ATL::CStringT<BaseType,StringTraits> &,char)' sein [bei der Verwendung der argumentbezogenen Suche gefunden]
            with
            [
                BaseType=wchar_t,
                StringTraits=StrTraitMFC_DLL<wchar_t>
            ]
            c:\programme\microsoft visual studio 8\vc\atlmfc\include\cstringt.h(2316): oder "ATL::CStringT<BaseType,StringTraits> ATL::CStringT<BaseType,StringTraits>::operator +(const ATL::CStringT<BaseType,StringTraits> &,wchar_t)" [bei argumentbezogenem Lookup gefunden]
            with
            [
                BaseType=wchar_t,
                StringTraits=StrTraitMFC_DLL<wchar_t>
            ]
            oder "integrierter C++-Operator+(const wchar_t *, UINT)"
            bei Anpassung der Argumentliste '(CString, UINT)'
    

    ähnlich hier

    m_strInputText = nChar;
    
    y:\cpp\2006\mfclearn\visualkb\visualkb\visualkb.cpp(281) : error C2593: 'Operator =' ist mehrdeutig
            c:\programme\microsoft visual studio 8\vc\atlmfc\include\cstringt.h(1315): kann 'ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>::operator =(wchar_t)' sein
            with
            [
                BaseType=wchar_t,
                StringTraits=StrTraitMFC_DLL<wchar_t>
            ]
            c:\programme\microsoft visual studio 8\vc\atlmfc\include\cstringt.h(1308): oder "ATL::CStringT<BaseType,StringTraits> &ATL::CStringT<BaseType,StringTraits>::operator =(char)"
            with
            [
                BaseType=wchar_t,
                StringTraits=StrTraitMFC_DLL<wchar_t>
            ]
            bei Anpassung der Argumentliste '(CString, UINT)'
    

    da das Beispiel aus einem Buch ist sehe ich nicht wo der Fehler herkommt und wie ich ihn verhindern könnte.

    Definiert ist die Variable als

    CString m_strInputText;                // Input text
    

    Matthias



  • Und was ist nChar?


  • Mod

    Vermutlich eben nur ein char, und deshlab sind ale Compilerfehler normal und hausgemacht.



  • Martin Richter schrieb:

    Vermutlich eben nur ein char, und deshlab sind ale Compilerfehler normal und hausgemacht.

    Wenn es ein char wäre, sollte doch klar sein, welche Überladung die richtige ist 😕


  • Mod

    Ganz und gar nicht. Denn aus den Fehlermeldungen geht hervor, dass der CString ein Unicode CString ist und diesem Fall gibt es eben keine Zurodnung und Überladungen für ein char!

    Der CString ist in diesem Fall eben ein CStringW und kein CStringA!



  • Martin Richter schrieb:

    Ganz und gar nicht. Denn aus den Fehlermeldungen geht hervor, dass der CString ein Unicode CString ist und diesem Fall gibt es eben keine Zurodnung und Überladungen für ein char!

    Doch, gibt es. Schau selbst in cstringt.h nach, die Zeilennummer stehen ja in der Fehlermeldung. Es gibt einen operator+ für char und einen für wchar_t, unabhängig von BaseType. Und der Compiler weiß hier nicht, welchen er benutzen soll, woraus ich folgere, dass nChar keines von beiden ist.


  • Mod

    Upps..
    Du hast vollkommen Recht. In meinen Augen ein Fehldesign... Naja.



  • Die Diskussion hat mich leider noch nicht weitergebracht. Falls ihr noch weitere Informationen benötigt sagt mir welche.

    nChar wird übrigens definiert als "UINT nChar", z.B. in

    void CMainWindow::OnChar (UINT nChar, UINT nRepCnt, UINT nFlags)
    {
        ShowMessage (_T ("WM_CHAR"), nChar, nRepCnt, nFlags);
    
        CClientDC dc (this);
    
        //
        // Determine which character was just input from the keyboard.
        //
        switch (nChar) {
    
        case VK_ESCAPE:
        case VK_RETURN:
    ...
    

    Matthias



  • dein nChar ist eine Zahl und kein Zeichen, daher kannst dich nicht so einfach an den string ranhängen. Dazu musst du es erst umwandeln/casten.
    In diesem Fall ist einfach der Ordinalwert des Zeichens in nChar enthalten.



  • Pellaeon schrieb:

    dein nChar ist eine Zahl und kein Zeichen, daher kannst dich nicht so einfach an den string ranhängen. Dazu musst du es erst umwandeln/casten.
    In diesem Fall ist einfach der Ordinalwert des Zeichens in nChar enthalten.

    Deinen Hinweis verstehe ich vollkommen. Allerdings habe ich jetzt 2 Stunden damit zugebracht mit dem Versuch heruauszufinden wie man mit VS/C++ integer in strings konvertiert.

    Ich versuche gerade mich in V/C++ einzuarbeiten und kenne hauptsächlich visual basic. Dort ist das ein simple strVariable = str(intVar). Alles was ich in der Hilfe finden konnte waren vergleichbare Funktionen für VB oder .Net, aber nichts was rein mit C++ ginge.

    Hoffe das ihr mir diese simple Frage beantworten könnt.

    Matthias



  • char lsChar; // Zeichen der gedrückten Taste
    
     // Code der gedrückten Taste in Zeichen umwandeln
     lsChar = char(nChar);
    
     // Ist Zeichen ein "A"?
     if (lsChar == 'A')
     {
       //Mach was
     }
    

    LowFly


Log in to reply