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 1
    

    Der 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ür char und wchar_t zwingend. 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.


Anmelden zum Antworten