500LOC не мало. Я говорил про http://apotheca.hpl.hp.com/ftp/stl/stl.zip Автоптр не имеет, выдирать из STLPort не много сложнее чем из http://www.sgi.com/tech/stl/memory или http://code.google.com/p/ontl/source/browse/branches/x64/ntl/stlx/smart_ptr.hxx
уууфффф.. день работы и получилось подрубить sgi )) рабочий код, кому интересно 1. переименовал все файлики vеctor -> vector.hxx, list->list.hxx... чтобы не создавать путаницы между стандартным stl и новым. 2. поправил ссылки в инклудах: #include <vector.hxx>, #include <list.hxx> и т.д. 3. создал файлик new.h с определением операторов new, delete. 4. определил следующие флаги: #define __STL_HAS_NAMESPACES #define __STL_USE_NEW_IOSTREAMS #define __STL_CLASS_PARTIAL_SPECIALIZATION #define __STL_NO_EXCEPTION_HEADER 5. вот кодес, компилящийся на Keil: Код (Text): #include <at91sam7s256.h> #include <lib_at91sam7s256.h> #define __STL_HAS_NAMESPACES #define __STL_USE_NEW_IOSTREAMS #define __STL_CLASS_PARTIAL_SPECIALIZATION #define __STL_NO_EXCEPTION_HEADER #include <list.hxx> int main() { std::list<char> x; char c; x.push_back('a'); x.push_back('b'); x.push_back('c'); for (std::list<char>::iterator i = x.begin(); i != x.end(); i ++) { c = *i; c ++; } }
осталась проблемка с std::string. строки отказываются работать. вылазит ошибка Error[Pe070]: incomplete type is not allowed. компилятору не нравится вот такие конструкции Код (Text): unsigned int x = ios::left; или Код (Text): const bool __left = (__os.flags() & ios::left) != 0; , т.е. обращение к статическим членам класса ios. странно, конечно. такие вещи спокойно компилятся: Код (Text): class Cx { public: static const int x = 3245; }; int main() { unsigned int x = Cx::x; return 0; }
cupuyc Похоже что там где нужно полное определение ios инклудится только iosfwd (то есть его forward declaration).
ну, не знаю, что там заявлено. вот кусок кода, которые принципиально не будет компилиться ни на чём, кроме VC: Код (Text): #ifndef NTL__EXTERNAPI #ifdef _MSC_VER #define NTL__EXTERNAPI extern "C" __declspec(dllimport) #else #error usupported compiler #endif #endif А вот это вообще какая-то глупость. Что за "I Love MSVC 2005!" ? Код (Text): typedef struct { template<typename any> operator any * () const { return 0; } template<class any, typename T> operator T any:: * () const { return 0; } private: // nullptr_t();// {} // nullptr_t(const nullptr_t&); // void operator = (const nullptr_t&); void operator & (); template<typename any> void operator +(any) const { I Love MSVC 2005! } template<typename any> void operator -(any) const { I Love MSVC 2005! } // void * _; } nullptr_t; далее. на такой код компилятор выдаёт (имхо, вполне логично): "Error[Pe020]: identifier "T" is undefined". Что за T? Код (Text): template<class ForwardIterator1, class ForwardIterator2> __forceinline void iter_swap(ForwardIterator1 a, ForwardIterator2 b) { T temp( *a ); *a = *b; *b = temp; } далее, ещё одной ';' не хватает. Код (Text): for ( first != last; ++first, ++result ) ну, уж такие явные баги любой компилятор увидит. почему не видит VC? ну.. скорее всего потому, что он просто не проверяет синтаксис у неиспользуемых шаблонов.
Note that trunk/ntl codebase is not supported and deprecated Актуальный код в branches/x64. Для GCC отдельный branches/stlx но похоже несколько устарел.
Кстати, удивительная вещь. Есть коммерческий компилятор для ARM'ов - IAR. В состав входит своя STL библиотека. Примечательно, что качество кода в этой библиотеке получается ниже, чем у SGI. Качество ниже как по быстродействию (примерно в ~2 раза) так и по размеру (~10%). Хотя SGI вообще не рассчитана на всякие там ARM'ы ))
Вообще говоря, SGI частично компилируется. Указатели, списки работают даже лучше чем я ожидал. Мне этого, как-бы, достаточно. Жаль, конечно, что со строками проблема. По ходу пьесы буду разбираться где собака зарыта. _DEN_, да, видимо что-то с последовательностью описания классов.
Проблема с basic_string из SGI вот где: // file <string> #ifdef __STL_USE_NEW_IOSTREAMS #include <iosfwd> #else /* __STL_USE_NEW_IOSTREAMS */ #include <char_traits.h> #endif /* __STL_USE_NEW_IOSTREAMS */ Откуда берется <iosfwd>? не нашел в библиотеке. Не надо #define __STL_USE_NEW_IOSTREAMS и не будет оператор <<
Не создаются ли проблемы на ровном месте? GCC имеет libcpp, чем не устраивает, если не нужны стримы то list header-only ?
J0E, его я привёл в качестве примера. Когда пробовал подключить взял сначала на VC - всё заработало. Затем попробовал на Keil'е - там вылезла куча ошибок. Попробовал на CodeBlocks - опять вылезла куча ошибок. В gcc я решил проверить потому, что он более строг к стандарту. А вообще я не сторонник написания софта на GCC с последующей отладкой под GDB. Это по части мазахистов.