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 Codefirstist ein Zeiger auf einenwstring, nicht einwstringselbst.
Mach daraus einfachi->first->c_str()
-
PS: bitte keine Lösung mit C++11
Tjo, mit Lambdas und
std::find_ifwäre das schon schöner :pEdit: 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 lieberif( (*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.