代码之家  ›  专栏  ›  技术社区  ›  Ivan Krechetov

嵌套boost::lambda::bind-s时出现问题

  •  2
  • Ivan Krechetov  · 技术社区  · 17 年前

    我有一个通用函数:

    void ImageAlbum::ExpressButtonPressed(
        boost::function<
            void (
                thumb::PhotoPrintThumbnail*,
                thumb::PhotoPrintFormat,
                thumb::PhotoPrintQuantity
            )
        > memberToCall
    ) {
        ...
    
        BOOST_FOREACH(thumb::PhotoPrintThumbnail *pThumbnail, m_thumbs.GetSelected()) {
        memberToCall(
                pThumbnail,
                m_expressSel.GetSelectedFormat(),
                m_expressSel.GetSelectedQuantity()
            );
        }
    
        ...
    }
    

    ExpressButtonPressed(boost::bind(&thumb::PhotoPrintThumbnail::AddQuantity, _1, _2, _3));
    

    ExpressButtonPressed(
        boost::lambda::bind(
            &thumb::PhotoPrintThumbnail::SetFormats,
            _1,
            boost::lambda::bind(
                boost::lambda::constructor<thumb::PhotoPrintThumbnail::LoadedFormats>(),
                1,
                boost::lambda::bind(
                    boost::lambda::constructor<thumb::PhotoPrintThumbnail::LoadedFormat>(),
                    _2,
                    _3
                )
            )
        )
    );
    

    这会导致“boost/lambda/detail/actions.hpp(96):错误C2665:'boost::lambda::function_adapter::apply':这两个重载都无法转换所有参数类型”。

    我在这里做错了什么?

    class PhotoPrintThumbnail {
    public:
    ...
        typedef std::pair<PhotoPrintFormat, PhotoPrintQuantity> LoadedFormat;
        typedef std::list<LoadedFormat> LoadedFormats;
        void SetFormats(const LoadedFormats &formats);
    
    3 回复  |  直到 16 年前
        1
  •  4
  •   Éric Malenfant    17 年前

    你是否碰巧使用代码在lambda中包含boost/bind.hpp?这将导致占位符(_1、_2等)的无条件使用解析为Boost定义的占位符。Bind,这些与Boost不能很好地混合。Lambda。

        2
  •  0
  •   jon hanson    17 年前

    不确定您使用的是哪个版本的Boost或哪个编译器。使用boost 1.37和VS2005,我可能会得到同样的错误。我怀疑可能是模板扩展的核心错误导致了SFINAE问题。

    boost::function<
        PhotoPrintThumbnail::LoadedFormat (
                PhotoPrintFormat,
                PhotoPrintQuantity
        )
    > func = boost::lambda::bind
                    ( boost::lambda::constructor<PhotoPrintThumbnail::LoadedFormat>()
                    , _1
                    , _2
                    );
    

    在我看来,这还可以,但也失败了,尽管有一个:

    std::pair<_Ty1、_Ty2>;::pair':3个重载都无法转换所有参数类型

    错误。

    void func
    ( PhotoPrintThumbnail* ppt
    , const PhotoPrintFormat& ppf
    , const PhotoPrintQuantity& ppq
    )
    {
        ppt->SetFormats (PhotoPrintThumbnail::LoadedFormats (1, PhotoPrintThumbnail::LoadedFormat (ppf, ppq)));
    }
    
    ExpressButtonPressed (func);
    

    哪个更清楚 并编译 .

        3
  •  0
  •   Cătălin Pitiș    17 年前

    我认为在第一次绑定时,您应该将构造的对象(由第二次绑定产生)绑定为方法的第一个参数(它应该是构造对象的地址):

    ExpressButtonPressed(
        boost::lambda::bind(
            &thumb::PhotoPrintThumbnail::SetFormats,
            boost::lambda::bind(
                    boost::lambda::constructor<thumb::PhotoPrintThumbnail::LoadedFormats>(),
                    1,
                    boost::lambda::bind(
                            boost::lambda::constructor<thumb::PhotoPrintThumbnail::LoadedFormat>(),
                            _2,
                            _3
                    )
            ),
            _1
        )
    );
    

    推荐文章