Не компилируется на gcc-2.95 такая конструкция:
vector<boost::shared_ptr<int> > v;
for_each(v.begin(), v.end(), cout << *(_1));
Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
Здравствуйте, Garrrrr, Вы писали:
G>Не компилируется на gcc-2.95 такая конструкция: G> vector<boost::shared_ptr<int> > v; G> for_each(v.begin(), v.end(), cout << *(_1)); G>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
Здравствуйте, jazzer, Вы писали:
J>Здравствуйте, Garrrrr, Вы писали:
G>>Не компилируется на gcc-2.95 такая конструкция: G>> vector<boost::shared_ptr<int> > v; G>> for_each(v.begin(), v.end(), cout << *(_1)); G>>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
J>а если без скобок, просто *_1?
Да без разницы... получается, что невозможно использовать _1 для смарт-пойнтеров?
Здравствуйте, Garrrrr, Вы писали:
G>Не компилируется на gcc-2.95 такая конструкция: G> vector<boost::shared_ptr<int> > v; G> for_each(v.begin(), v.end(), cout << *(_1)); G>Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
Garrrrr wrote:
> Не компилируется на gcc-2.95 такая конструкция: > vector<boost::shared_ptr<int> > v; > for_each(v.begin(), v.end(), cout << *(_1)); > Так и должно быть или все таки сам? точнее если возможно — можно это заставить заработать?
sergey_shandar wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>Приведи диагностику компилятора. > > Вероятно 'iterator_category' : is not a member of 'boost::shared_ptr<T>'.
Наверное boost древний стоит.
Я скомпилил со свежим бустом на VC7.1 — все Ok.
Свежий буст можно взять из CVS или по http ежечасный CVS tarball.
Здравствуйте, MaximE, Вы писали:
ME>Наверное boost древний стоит.
Извини, Максим, но свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю. . Но спасибо за обнадеживающую информацию, что, вероятно, проблемы с *_1 будут в следующем релизе исправленны. А пока будем обрабатывать напильником до нужной формы.
Здравствуйте, MaximE, Вы писали:
ME>sergey_shandar wrote:
>> Здравствуйте, MaximE, Вы писали: >> >> ME>Приведи диагностику компилятора. >> >> Вероятно 'iterator_category' : is not a member of 'boost::shared_ptr<T>'.
ME>Наверное boost древний стоит.
ME>Я скомпилил со свежим бустом на VC7.1 — все Ok.
ME>Свежий буст можно взять из CVS или по http ежечасный CVS tarball.
ME>-- ME>Maxim Yegorushkin
boost 1.30.1 gcc-2.95
Соотвественно версии бибилиотек и компилятора неизменны....
Здравствуйте, korzhik, Вы писали:
K>Здравствуйте, sergey_shandar, Вы писали:
K>Сергей, у вас "дьявольское" число в общем числе сообщений в профайле, поэтому срочно чего нибудь сюда напишите, пока что нибудь не случилось
Ok. Еще один напильник, для оператора ->*. Но документации не нашел, поэтому, возможно, что все можно сделать проще или правильнее.
#include <boost/shared_ptr.hpp>
#include <boost/lambda/lambda.hpp>
namespace boost
{
namespace lambda
{
template<class T>
struct plain_return_type_1<other_action<contentsof_action>, shared_ptr<T> >
{
typedef T &type;
};
/// Тип возврата оператора ->*.template<class A, class B>
struct return_type_2<other_action<member_pointer_action>, shared_ptr<A>, B>:
return_type_2<other_action<member_pointer_action>, A *, B>
{
};
/// Странный оператор ->* для shared_ptr.
/// Работает только в пространстве boost::lambda.template<class T, class F>
typename lambda::return_type_2<lambda::other_action<lambda::member_pointer_action>, T *, F>::type
operator->*(const shared_ptr<T> &a, F f)
{
T *p = a.get();
return (lambda::_1 ->* f)(p);
}
}
}
// проверка#include <iostream>
#include <vector>
#include <algorithm>
struct A
{
public:
int f;
void F() { std::cout << "Elki"; }
};
int main()
{
using namespace boost::lambda;
std::vector<boost::shared_ptr<int> > v;
v.push_back(boost::shared_ptr<int>(new int(1)));
//std::vector<int *> v;
std::for_each(v.begin(), v.end(), std::cout << *_1);
std::vector<boost::shared_ptr<A> > a;
a.push_back(boost::shared_ptr<A>(new A()));
(a[0] ->* &A::F)(); /// проверка странного оператора boost::lambda::->*
//std::vector<A *> a;
std::for_each(a.begin(), a.end(), _1 ->* &A::F);
std::for_each(a.begin(), a.end(), (_1 ->* &A::f) = 1);
return 0;
}
Здравствуйте, sergey_shandar, Вы писали:
_>Ok. Еще один напильник, для оператора ->*. Но документации не нашел, поэтому, возможно, что все можно сделать проще или правильнее.
Простите, это я поспешил. Конечно же здесь серьезная ошибка
template<class T, class F>
typename lambda::return_type_2<lambda::other_action<lambda::member_pointer_action>, T *, F>::type
operator->*(const shared_ptr<T> &a, F f)
{
T *p = a.get();
return (lambda::_1 ->* f)(p);
}
Нужно так:
template<class T, class F>
typename return_type_2<other_action<member_pointer_action>, T *, F>::type
operator->*(const shared_ptr<T> &a, F f)
{
return ((&_1) ->* f)(*a);
}
sergey_shandar wrote:
> ME>Наверное boost древний стоит. > Извини, Максим, но свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.
Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a.
Здравствуйте, MaximE, Вы писали:
ME>Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a.
Страх и не уверенность обычно порождения недостатка информации. Я сказал именно это "свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.". Если где то есть стабильный релиз, то я его не видел. CVS версию я не называю стабильным релизом и в своем проекте, на работе, использовать вряд ли буду. Поиграться можно с ним, но не более. Если им так угодно, пусть называют fudsterом, релиза более свежего релиза я все равно не вижу
sergey_shandar wrote:
> Здравствуйте, MaximE, Вы писали: > > ME>Мне тут подумалось, что за такие слова в comp.lang.c++.moderated или в gmane.comp.lib.boost.devel тебя бы точно назвали fudster'ом (от слова FUD), за внушение страха и неуверенности в отношении boost'a. > > Страх и не уверенность обычно порождения недостатка информации. Я сказал именно это "свежее 1.31.0 стабильного релиза на 12/10/2004 я не знаю.". Если где то есть стабильный релиз, то я его не видел. CVS версию я не называю стабильным релизом и в своем проекте, на работе, использовать вряд ли буду. Поиграться можно с ним, но не более. Если им так угодно, пусть называют fudsterом, релиза более свежего релиза я все равно не вижу
На CVS версии несколько раз в день гоняются регрешшены, поэтому, чтобы не назвать CVS версию стабильной или назвать нестабильной нужны веские основания. Это моё имхо, и я всегда буду пользовать свежак из CVS.