Доброго времени суток
Есть у меня один проект на C++ с использованием стандартного STL. Хочу в целях увеличения производительности перевести его на STLPort. Поставил STLPort 5.1.3, прикрутил его к VS2005.
Всплыли следующие косяки:
std::sort(m_vecItems.begin(), m_vecItems.end(), ItemSortPred); // ошибка:stlport\stlport\stl\_algo.c(84): cannot convert parameter 2 from 'const SomeItem' to 'SomeItem &'
//описание вектора:
std::vector<SomeItem> vecItems;
Это бага STLPort-а? Если в контейнере лежат указатели — все нормально. Или же это фича из серии "а нефиг хранить в контейнере экземпляры объектов!"
далее:
typedef std::multimap<int, MemoryImage*, std::greater<int> > SortedImageMap; // error C2039: 'greater' : is not a member of 'stlp_std'
из этой же серии:
PointClipper<std::greater_equal<float> > aGreaterClipper; //error C2039: 'greater_equal' : is not a member of 'stlp_std'
еще:
std::auto_ptr<ImageLib::Image> aDelAlphaImage(anAlphaImage); // error C2039: 'auto_ptr' : is not a member of 'stlp_std'
А с этим что делать?
Возможно, существует некий препроцессорный дефайн _STLPORT_ENABLE_STL_COMPAT?
Жду советов. Трогать исходники проекта и как-то их править не хочется.
Заранее спасибо
Re: STLPort: совместимость с стандартным STL кодом
> typedef std::multimap<int, MemoryImage*, std::greater<int> > SortedImageMap; // error C2039: 'greater' : is not a member of 'stlp_std'
>
> из этой же серии: >
> PointClipper<std::greater_equal<float> > aGreaterClipper; //error C2039: 'greater_equal' : is not a member of 'stlp_std'
>
> > еще: >
> std::auto_ptr<ImageLib::Image> aDelAlphaImage(anAlphaImage); // error C2039: 'auto_ptr' : is not a member of 'stlp_std'
>
> > А с этим что делать?
Скорее всего просто инклюдов каких-то не хватает.
> Возможно, существует некий препроцессорный дефайн _STLPORT_ENABLE_STL_COMPAT? > > Жду советов. Трогать исходники проекта и как-то их править не хочется. > Заранее спасибо >
Posted via RSDN NNTP Server 2.1 beta
Одним из 33 полных кавалеров ордена "За заслуги перед Отечеством" является Геннадий Хазанов.
Re: STLPort: совместимость с стандартным STL кодом
Здравствуйте, Longobard, Вы писали:
L>Всплыли следующие косяки: L>
L>std::sort(m_vecItems.begin(), m_vecItems.end(), ItemSortPred); // ошибка:stlport\stlport\stl\_algo.c(84): cannot convert parameter 2 from 'const SomeItem' to 'SomeItem &'
L>//описание вектора:
L>std::vector<SomeItem> vecItems;
L>
L>Это бага STLPort-а? Если в контейнере лежат указатели — все нормально. Или же это фича из серии "а нефиг хранить в контейнере экземпляры объектов!"
1. vecItems и m_vecItems — разные имена, вообще-то.
2. объявление ItemSortPred в студию.
3. раз уж m_vecItems, то, наверное, дело происходит в методе — он не константный случаем?
J>1. vecItems и m_vecItems — разные имена, вообще-то.
Ошибся при копипасте
J>2. объявление ItemSortPred в студию.
bool ItemSortPred(SomeItem& a, SomeItem& b)
J>3. раз уж m_vecItems, то, наверное, дело происходит в методе — он не константный случаем?
нет конечно.
Если бы он был константный — то и обычный std::sort ни к чему бы не привел.
Re[3]: STLPort: совместимость с стандартным STL кодом
Здравствуйте, Longobard, Вы писали:
S>>Скорее всего просто инклюдов каких-то не хватает.
L>Поиск по директории с stlport показал, что файлов, содержащих строку "auto_ptr" не найдено. L>Это как понимать?
как вариант: понимать так, что он полагается на реализацию, которая идет с компилятором.
Все уже сказали, только вроде не всегда объяснили почему Попробую, рассказать, как я понимаю (заодно проверю, как освоил STL).
L>
L>std::sort(m_vecItems.begin(), m_vecItems.end(), ItemSortPred); // ошибка:stlport\stlport\stl\_algo.c(84): cannot convert parameter 2 from 'const SomeItem' to 'SomeItem &'
L>//описание вектора:
L>std::vector<SomeItem> vecItems;
L>
L>Это бага STLPort-а? Если в контейнере лежат указатели — все нормально. Или же это фича из серии "а нефиг хранить в контейнере экземпляры объектов!"
sort принимает предикат. Предикат по определению — функция, значение которой полностью определяется аргументами. Т.е. предикат не может менять свое внутреннее состояние в процессе использования. Также предикат не должен модифицировать проверяемые объекты, чтобы не изменился порядок сортировки. Соответственно, аргументы в предикат должны поступать константные. Если предикат — функтор, то operator () должен быть объявлен как const (предикат не должен менять свое состояние). Налицо более качественная реализация STL в STLport.
L>далее: L>
L>typedef std::multimap<int, MemoryImage*, std::greater<int> > SortedImageMap; // error C2039: 'greater' : is not a member of 'stlp_std'
L>
L>из этой же серии: L>
L>PointClipper<std::greater_equal<float> > aGreaterClipper; //error C2039: 'greater_equal' : is not a member of 'stlp_std'
L>
L>еще: L>
L>std::auto_ptr<ImageLib::Image> aDelAlphaImage(anAlphaImage); // error C2039: 'auto_ptr' : is not a member of 'stlp_std'
L>
Не хватает инклюдов. В стандарте определено, какие заголовки нужно включать в проект, чтобы были доступны определенные объекты STL. Иногда в разных реализациях STL включение одних заголовков делает необязательным включением некоторых других. Если полагаться на подобное поведение, то это приведет к возможной непереносимости кода — код станет некомилируемым на другой реализации STL. Что в данном случае и происходит. Т.е. твой код не соответствует правилам использования STL.