Варим кашу в буст - lambda + bind + shared_ptr
От: AgIle Россия  
Дата: 29.08.06 10:42
Оценка:
Всем привет!


class IDownloaderObserver
{
public:
    virtual void OnCompleted(CString const& fileName)    =0;
};

typedef shared_ptr<IDownloaderObserver> IDownloaderObserverPtr;

typedef vector<IDownloaderObserverPtr> DownloadObservers;

class DownloadSubject
{
public:
    void registerObserver(IDownloaderObserverPtr observer);
    void removeObserver(IDownloaderObserverPtr observer);

protected:
    void notifyCompleted(CString const& fileName);

private:
    /*DownloadObservers*/ vector<IDownloaderObserver*> downloadObservers;
};

void DownloadSubject::notifyCompleted(CString const& fileName)
{
    for_each(    downloadObservers.begin(),
            downloadObservers.end(),
            lambda::bind(&IDownloaderObserver::OnCompleted, lambda::_1, fileName)    );

}


Выше приведенный код прекрастно компилируется...
Но давайте изменим тип downloadObservers на DownloadObservers ...
Как теперь заставить его работать? Пишет ошибку:

c:\Agile\libr\boost\include\boost-1_33_1\boost\lambda\detail\actions.hpp(96): error C2665: 'boost::lambda::function_adaptor<Func>::apply' : none of the 2 overloads can convert parameter 2 from type 'std::allocator<_Ty>::value_type'
with
[
Func=boost::lambda::return_type_N<boost::lambda::function_action<3>,boost::lambda::lambda_functor_base<boost::lambda::action<3,boost::lambda::function_action<3>>,boost::tuples::tuple<const boost::lambda::detail::bind_traits<void (__thiscall IDownloaderObserver::* const )(const CString &)>::type,const boost::lambda::detail::bind_traits<const boost::lambda::placeholder1_type>::type,const boost::lambda::detail::bind_traits<const CString>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type,boost::lambda::detail::bind_traits<boost::tuples::null_type>::type>>::sig<boost::tuples::tuple<std::allocator<IDownloaderObserverPtr>::value_type &,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type,boost::tuples::null_type>>::rets_t>::plain_Func
]
and
[
_Ty=IDownloaderObserverPtr
]

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.