Kleiner Fehler bei STL-Container - bitte um schnelle hilfe



  • Ich habe glaube gerade einen kleinen Denkfehler und komme nicht auf eine idee, was das problem sein könnte.

    mein code:

    // this vector contains all objects of TStringLanguage
    // -> first element: index (identification/name of the languages)
    // -> second element: pointer to a language
    std::vector<std::pair<std::wstring*,TStringLanguage*> > m_vecLanguages;
    
    template<class TStringLanguage>
    bool db::CStringManager<TStringLanguage>::existLanguage(const std::wstring& _name){
    	// loop through the vector (m_vecLanguages)
    	std::vector<std::pair<std::wstring*,TStringLanguage*> >::iterator i;
    	for(i = m_vecLanguages.begin(); i != m_vecLanguages.end(); ++i) {
    		// test whether the element has the given name
    		if( std::wstring( (*i).first ).c_str() == _name.c_str() ){
    			// element found -> return true
    			return true;
    		}
    	}
    
    	// no element with this name -> return false
    	return false;
    }
    

    er gibt mir folgenden fehler aus:

    1> main.cpp
    1>f:\stringmanager\stringmanager\cstringmanager.h(191): error C2440: '<function-style-cast>': 'std::basic_string<_Elem,_Traits,_Ax> ' kann nicht in 'std::wstring' konvertiert werden
    1> with
    1> [
    1> _Elem=wchar_t,
    1> _Traits=std::char_traits<wchar_t>,
    1> _Ax=std::allocator<wchar_t>
    1> ]
    1> Quelltyp konnte von keinem Konstruktor angenommen werden, oder die Überladungsauflösung des Konstruktors ist mehrdeutig
    1> f:\stringmanager\stringmanager\cstringmanager.h(186): Bei der Kompilierung der Klassen-template der bool db::CStringManager<TStringLanguage>::existLanguage(const std::wstring &)-Memberfunktion
    1> with
    1> [
    1> TStringLanguage=db::CStringLanguage
    1> ]
    1> f:\stringmanager\stringmanager\cstringmanager.h(71): Bei der Kompilierung der Klassen-template der db::CStringManager<TStringLanguage>::CStringManager(void)-Memberfunktion
    1> with
    1> [
    1> TStringLanguage=db::CStringLanguage
    1> ]
    1> f:\stringmanager\stringmanager\main.cpp(8): Siehe Verweis auf die Instanziierung der gerade kompilierten Klassen-template "db::CStringManager<TStringLanguage>".
    1> with
    1> [
    1> TStringLanguage=db::CStringLanguage
    1> ]
    1>f:\stringmanager\stringmanager\cstringmanager.h(191): error C2228: Links von ".c_str" muss sich eine Klasse/Struktur/Union befinden.

    PS: bitte keine Lösung mit C++11 😃 macht ich immer neidisch weil mein compiler das nicht kann (sollte echt mal wechseln)



  • std::wstring( (*i).first ).c_str() /// Zeile 7 im obigen Code
    

    first ist ein Zeiger auf einen wstring , nicht ein wstring selbst.
    Mach daraus einfach

    i->first->c_str()
    


  • PS: bitte keine Lösung mit C++11

    Tjo, mit Lambdas und std::find_if wäre das schon schöner :p

    Edit: Du hast da einen schlimmen Fehler! Du kannst doch nicht zwei C-Strings mit == vergleichen!



  • Wovon ich spreche:

    if( std::wstring( (*i).first ).c_str() == _name.c_str() )
    

    Ganz schlechte Idee!
    Mach lieber

    if( (*i->first) == _name )
    


  • Du hast da einen schlimmen Fehler! Du kannst doch nicht zwei C-Strings mit == vergleichen!

    Ach du Sche***, das hab ich in meinem halben projekt so gemacht 😮 (gut das ich noch nicht soweit bin).
    Hatte aber bisher komischerweise noch keine Fehler.

    (*i->first) == _name

    scheint zu funktionieren 😉



  • Weshalb hast du überhaupt Pointer? Warum nicht einfach std::pair<std::wstring,TStringLanguage> ?
    Btw Modern C++



  • Hatte aber bisher komischerweise noch keine Fehler.

    Hast du das überhaupt mal getestet?

    faqir schrieb:

    Weshalb hast du überhaupt Pointer? Warum nicht einfach std::pair<std::wstring,TStringLanguage> ?

    👍



  • Um noch etwas weiter zu gehen, warum nicht std::map<std::wstring, TStringLanguage> ?

    Dann wird die Funktion zu

    template<class TStringLanguage>
    bool db::CStringManager<TStringLanguage>::existLanguage(const std::wstring& _name){
        return m_mapLanguages.count(_name);
    }
    

    Btw^2: Namen, die mit Unterstrichen beginnen, sollte man in C++ vermeiden, weil sie nahe an den reservierten Bezeichnern sind.


Anmelden zum Antworten