Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/124.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 嵌套boost::lambda::bind-s时出现问题_C++_Boost Lambda - Fatal编程技术网

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

C++ 嵌套boost::lambda::bind-s时出现问题,c++,boost-lambda,C++,Boost Lambda,我有一个通用函数: void ImageAlbum::ExpressButtonPressed( boost::function< void ( thumb::PhotoPrintThumbnail*, thumb::PhotoPrintFormat, thumb::PhotoPrintQuantity ) > memberToCall ) { ...

我有一个通用函数:

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()
        );
    }

    ...
}
然后,我需要将它们全部替换为单一格式,而不是向缩略图中添加一定数量的特定格式。更精确地说,使用1个元素的列表,如下所示:

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
            )
        )
    )
);
expressbutton按下(
boost::lambda::bind(
&thumb::PhotoPrintThumbnail::SetFormats,
_1,
boost::lambda::bind(
boost::lambda::构造函数(),
1.
boost::lambda::bind(
boost::lambda::构造函数(),
_2,
_3
)
)
)
);
这将导致“boost/lambda/detail/actions.hpp(96):错误C2665:'boost::lambda::function_adapter::apply':两个重载都不能转换所有参数类型”

我做错了什么

顺便说一句

类照片打印缩略图{
公众:
...
typedef std::pair-LoadedFormat;
typedef std::列表加载格式;
void SetFormats(常量加载格式和格式);

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

例如,取出最里面的表达式:

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

这更清晰,更容易编译。

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

expressbutton按下(
boost::lambda::bind(
&thumb::PhotoPrintThumbnail::SetFormats,
boost::lambda::bind(
boost::lambda::构造函数(),
1.
boost::lambda::bind(
boost::lambda::构造函数(),
_2,
_3
)
),
_1
)
);
我没有尝试编译代码。另一个可能的问题是,第二个绑定函子可能会按值返回构造的对象,而第一个绑定需要指向对象的指针(如此指针),所以您仍然需要一个指针作为SetFormats的第一个绑定参数。

您是否碰巧在使用代码的lambda中包含boost/bind.hpp?这将导致不合格地使用占位符(_1、_2等)来解析boost.bind定义的占位符,并且这些占位符与boost.lambda不兼容


重写代码以显式使用boost::lambda::u[1,2,3]在我的VC 7.1安装程序中,没有不合格的名称可以编译得很好。

想到有一天我可能不得不维护你的代码,我不寒而栗……)好吧,不要太不寒而栗,这只是我第一次尝试所有lambda的东西。我对我能推多远很感兴趣。很可能永远不会提交。错误消息是什么,尤其是典型的es及其模板参数?
class PhotoPrintThumbnail {
public:
...
    typedef std::pair<PhotoPrintFormat, PhotoPrintQuantity> LoadedFormat;
    typedef std::list<LoadedFormat> LoadedFormats;
    void SetFormats(const LoadedFormats &formats);
boost::function<
    PhotoPrintThumbnail::LoadedFormat (
            PhotoPrintFormat,
            PhotoPrintQuantity
    )
> func = boost::lambda::bind
                ( boost::lambda::constructor<PhotoPrintThumbnail::LoadedFormat>()
                , _1
                , _2
                );
void func
( PhotoPrintThumbnail* ppt
, const PhotoPrintFormat& ppf
, const PhotoPrintQuantity& ppq
)
{
    ppt->SetFormats (PhotoPrintThumbnail::LoadedFormats (1, PhotoPrintThumbnail::LoadedFormat (ppf, ppq)));
}

ExpressButtonPressed (func);
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
    )
);