4

これが機能しないのはなぜですか(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

2 に答える 2

6

decltypeネストされた名前指定子が比較的遅い段階でC++11に追加されたため。DR 743(およびDR 950 )の解決策としてのn3049。n3049は2010年3月に公開されたため、VC++への移行がまだ行われていない可能性があります。

回避策は、IDタイプ関数を使用することです。

template<typename T> using id = T;
id<decltype(expression)>::member;
于 2012-12-11T11:28:33.430 に答える
3

コンパイラのバグ。

decltype -specifier(7.1.6.2 Simple type specifiers [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__)
于 2012-12-11T10:59:49.510 に答える