basic_string<int> Fehler
-
Hi everyone
Auf meinem Hauptcomputer kompiliert folgende Funktion makellos:
120: ValuePtr Dif::asBCD(basic_string<int> &data, unsigned int size) const { 121: size /= 2; 122: basic_string<int> lvarData = list_of(0xC0 + size); 123: for(unsigned int i = 0; i < size; ++i) { 124: lvarData.push_back(data.at(i)); 125: } 126: data.erase(0, size); 127: return LVAR(lvarData).getValue(); 128: }Wenn ich das aber mit gcc 3.2 auf eine embedded Plattform kompiliere, erhalte ich folgende Fehlermeldung:
arm-linux-g++ -O3 -Wall -c -fmessage-length=0 -I/var/lib/hudson/jobs/emc/workspace/emc/src/main/include -I/var/lib/c++/boost/boost_1_42_0/target/uc-7112-plus/include -DBOOST_NO_EXPLICIT_FUNCTION_TEMPLATE_ARGUMENTS -MMD -MP -MF"src/main/com/emc/format/mbus/Dif.d" -MT"src/main/com/emc/format/mbus/Dif.d" -o"src/main/com/emc/format/mbus/Dif.o" "../src/main/com/emc/format/mbus/Dif.cpp" /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h: In instantiation of `std::iterator_traits': /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/basic_string.h:624: instantiated from `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::replace(__gnu_cxx::__normal_iterator >, __gnu_cxx::__normal_iterator >, _InputIterator, _InputIterator) [with _InputIterator = int, _CharT = int, _Traits = std::char_traits, _Alloc = std::allocator]' /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/basic_string.h:496: instantiated from `void std::basic_string<_CharT, _Traits, _Alloc>::push_back(_CharT) [with _CharT = int, _Traits = std::char_traits, _Alloc = std::allocator]' ../src/main/com/emc/format/mbus/Dif.cpp:124: instantiated from here /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h:126: error: `int' is not a class, struct, or union type /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h:127: error: `int' is not a class, struct, or union type /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h:128: error: `int' is not a class, struct, or union type /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h:129: error: `int' is not a class, struct, or union type /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/stl_iterator_base_types.h:130: error: `int' is not a class, struct, or union type /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/basic_string.h: In member function `std::basic_string<_CharT, _Traits, _Alloc>& std::basic_string<_CharT, _Traits, _Alloc>::replace(__gnu_cxx::__normal_iterator >, __gnu_cxx::__normal_iterator >, _InputIterator, _InputIterator) [with _InputIterator = int, _CharT = int, _Traits = std::char_traits, _Alloc = std::allocator]': /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/basic_string.h:496: instantiated from `void std::basic_string<_CharT, _Traits, _Alloc>::push_back(_CharT) [with _CharT = int, _Traits = std::char_traits, _Alloc = std::allocator]' ../src/main/com/emc/format/mbus/Dif.cpp:124: instantiated from here /var/toolchains/uc-7112-plus/arm-linux/include/c++/3.3.2/bits/basic_string.h:624: error: no type named `iterator_category' in `struct std::iterator_traits' make: *** [src/main/com/emc/format/mbus/Dif.o] Error 1Der Fehler scheint auf Zeile 124, bei der push_back-Anweisung zu entstehen. Mache ich da irgendwas falsch? Darf ich basic_string nicht mit int verwendent?
Besten Dank für jede Antwort und Grüsse
Kessi
-
Vermutlich ist auf der Embedded-Plattform keine Spezialisierung für
std::char_traits<int>definiert.
Nach Standard sind nur Spezialisierungen fürcharundwchar_tzwingend. Alles andere ist Compilerabhängig.
-
Das könnte ich mir sogar gut vorstellen, ja. Gibt es eine Möglichkeit, diese Spezialisierung selbst zur Verfügung zu stellen? Indem ich sie z.B. von meinem Host-gcc kopiere?
Komisch ist auch, dass ich basic_string<int> schon vorher im Code verwende, der Fehler aber erst an dieser Stelle auftritt...
-
Du verwendest den String, ja. Aber nicht die Traits, auf die der String nur in bestimmten Fällen zugreift. schau dir im netz mal an wie die char_traits aussehn müssen, dann kannst du entweder std::char_traits<int> spezialisieren (man darf zwar nichts im namespace std definieren, aber vollständige Spezialisierungen von Templates sind ne Ausnahme) oder du gibst dem basic_string deine int_traits als templateparameter mit.