& ampl decltype (obj) :: член не работает

Почему это не работает (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);
}

4

Решение

decltype как вложенное имя спецификатор был добавлен в C ++ 11 на относительно поздней стадии; n3049 в качестве разрешения DR 743 (а также DR 950). N3049 был опубликован в марте 2010 года, и, вероятно, поэтому он еще не попал в VC ++.

Обходной путь должен использовать функцию типа удостоверения:

template<typename T> using id = T;
id<decltype(expression)>::member;
6

Другие решения

Ошибка компилятора.

decltype спецификатор (7.1.6.2 Спецификаторы простых типов [dcl.type.simple]) явно разрешены как вложенное-имя-speficier (5.1 Первичные выражения [expr.prim] -> 5.1.1 Общие выражения 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__)
3

По вопросам рекламы [email protected]