STLPort: совместимость с стандартным STL кодом
От: Longobard Россия http://longobard.org.ru
Дата: 13.07.07 11:43
Оценка:
Доброго времени суток
Есть у меня один проект на 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 кодом
От: Sergey Россия  
Дата: 13.07.07 12:20
Оценка:
> далее:
>
> 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 кодом
От: jazzer Россия Skype: enerjazzer
Дата: 13.07.07 12:30
Оценка:
Здравствуйте, 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, то, наверное, дело происходит в методе — он не константный случаем?

Про остальное уже сказали.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: STLPort: совместимость с стандартным STL кодом
От: Longobard Россия http://longobard.org.ru
Дата: 13.07.07 12:43
Оценка:
J>1. vecItems и m_vecItems — разные имена, вообще-то.
Ошибся при копипасте

J>2. объявление ItemSortPred в студию.

bool ItemSortPred(SomeItem& a, SomeItem& b)

J>3. раз уж m_vecItems, то, наверное, дело происходит в методе — он не константный случаем?

нет конечно.
Если бы он был константный — то и обычный std::sort ни к чему бы не привел.
Re[3]: STLPort: совместимость с стандартным STL кодом
От: jazzer Россия Skype: enerjazzer
Дата: 13.07.07 12:45
Оценка:
Здравствуйте, Longobard, Вы писали:

J>>2. объявление ItemSortPred в студию.

L>bool ItemSortPred(const SomeItem& a, const SomeItem& b)
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[2]: STLPort: совместимость с стандартным STL кодом
От: Longobard Россия http://longobard.org.ru
Дата: 13.07.07 12:46
Оценка:
S>Скорее всего просто инклюдов каких-то не хватает.

Поиск по директории с stlport показал, что файлов, содержащих строку "auto_ptr" не найдено.
Это как понимать?
Re[3]: STLPort: совместимость с стандартным STL кодом
От: jazzer Россия Skype: enerjazzer
Дата: 13.07.07 12:47
Оценка:
Здравствуйте, Longobard, Вы писали:

S>>Скорее всего просто инклюдов каких-то не хватает.


L>Поиск по директории с stlport показал, что файлов, содержащих строку "auto_ptr" не найдено.

L>Это как понимать?

как вариант: понимать так, что он полагается на реализацию, которая идет с компилятором.
jazzer (Skype: enerjazzer) Ночная тема для RSDN
Автор: jazzer
Дата: 26.11.09

You will always get what you always got
  If you always do  what you always did
Re[3]: STLPort: совместимость с стандартным STL кодом
От: ShaggyOwl Россия http://www.rsdn.org
Дата: 13.07.07 13:12
Оценка:
Здравствуйте, Longobard, Вы писали:

L>Это как понимать?

Плохо искал. (STLportDir)\stlport\stl\_auto_ptr.h
Хорошо там, где мы есть! :)
Re: STLPort: совместимость с стандартным STL кодом
От: Ужасть бухгалтера  
Дата: 13.07.07 13:37
Оценка: 6 (1)
Все уже сказали, только вроде не всегда объяснили почему Попробую, рассказать, как я понимаю (заодно проверю, как освоил 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.
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.