类成员函数的 decltype



此代码在VS2010中无法编译:

template < typename A >
class X
{
    A& m_a;
public:
    X ( A& a ) : m_a ( a ) {}
    auto func ( int i ) -> decltype ( m_a ( i ) ) { return ( m_a ( i ) ); } // failing on this line
};
double f ( int a )
{
    return static_cast < double > ( a );
}
int main()
{
    X < decltype ( f ) > x ( f );
    std::cout << x.func(4) << std::endl;
    return 0;
}

我得到的错误是:错误 C2064:term 的计算结果不是采用 1 个参数的函数。

编译器似乎不认为m_a在 decltype 的范围内。

我该如何解决这个问题?

VS2010并没有完全按照标准的规定实现decltype(公平地说,它比标准的最终版本要早)。您应该能够使用手动编码declval来解决此问题:

template < typename A >
class X
{
    A& m_a;
    static A& simulated_m_a();
public:
    X ( A& a ) : m_a ( a ) {}
    auto func ( int i ) -> decltype ( simulated_m_a()( i ) ) { return ( m_a ( i ) ); }
};

我刚刚在我的VS2010上验证了它是否有效。

最新更新