为什么这不起作用(Visual C ++ 2012 Update 1),以及解决它的正确方法是什么?
#include <boost/lambda/bind.hpp>
namespace bll = boost::lambda;
struct Adder
{
int m;
Adder(int m = 0) : m(m) { }
int foo(int n) const { return m + n; }
};
#define bindm(obj, f, ...) bind(&decltype(obj)::f, obj, __VA_ARGS__)
int main()
{
return bll::bindm(Adder(5), foo, bll::_1)(5);
}
答案 0 :(得分:6)
decltype
在相对较晚的阶段被添加到C ++ 11中; n3049作为DR 743(和DR 950)的解决方案。 n3049于2010年3月发布,这可能是它尚未进入VC ++的原因。
解决方法是使用标识类型函数:
template<typename T> using id = T;
id<decltype(expression)>::member;
答案 1 :(得分:3)
编译器错误。
明确允许 decltype-specifier (7.1.6.2简单类型说明符[dcl.type.simple])作为嵌套名称 - speficier (5.1主表达式) [expr.prim] - &gt; 5.1.1 General expr.prim.general]#8)
PS。在@ ecatmur的想法之后:
template<typename T> struct id { typedef T type; };
#define bindm(obj, f, ...) bind(&id<decltype(obj)>::type::f, obj, __VA_ARGS__)