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